【发布时间】:2011-12-01 22:14:14
【问题描述】:
我想测试在可能连接或未连接的远程客户端上排队消息的可能性,这些客户端在连接时将通过托管在 IIS 6 中的 Internet 推送发送到 msmq 的消息。
现在,我在托管 IIS 的 win server2003 上设置 MSMQ。完成后,“MSMQ”会显示在 IIS 默认网站中。
好的,那我通过计算机管理->消息队列添加了一个新的事务私有队列。
从那里我想做的就是查看消息堆积,我会在完成后处理这些消息。
现在,我制作了一个包含以下代码的客户端应用程序:
using (var contract = new HttpMsmqBridgeProxy())
{
var valueToSend = 2456;
contract.TestFunction(valueToSend);
Console.WriteLine("value sent: " + valueToSend + "\r\n");
}
这是该客户端的 app.config:
<configuration>
<system.serviceModel>
<client>
<endpoint
address="net.msmq://**.**.***.228/private/MarksTestHttpQueue"
binding="netMsmqBinding"
bindingConfiguration="srmpBinding"
contract="HttpMsmqBridgeLibrary.IHttpMsmqBridgeContract">
</endpoint>
</client>
<bindings>
<netMsmqBinding>
<binding name="srmpBinding"
queueTransferProtocol="Srmp">
<security mode="None"/>
</binding>
</netMsmqBinding>
</bindings>
</system.serviceModel>
</configuration>
IP 是我的面向公众的有效 IP,我可以很好地托管 wcf 服务或网页。我在使用 srmpBinding 时遵循了本指南。
http://msdn.microsoft.com/en-us/library/aa395217.aspx
所以,简而言之,当我运行应用程序时会发生什么,它是否成功,告诉我它已发送,我进入客户端的消息队列并看到一个新队列已显示在 Outgoing 文件夹中,名为:
直接:http://..*.228/msmq/private$/MarksTestHttpQueue
此队列中没有等待的传出消息,因此我假设消息已发送。
当我现在在 winserver2003 上查看我的 msmq 时,没有等待到达的排队消息。
ETA:我可以使用经典的 MessageQueue 暗示将消息发送到非事务性队列:
var queue = new MessageQueue("FormatName:DIRECT=http://**.**.***.228/msmq/private$/nonTransQueue");
System.Messaging.Message Msg;
Msg = new System.Messaging.Message();
Msg.Formatter = new ActiveXMessageFormatter();
Msg.Body = "Testing";
queue.Send(Msg);
显示消息(在更改 system32/msmq/mapping 目录中的映射文件后)就好了。我想知道是否因为它是 IIS6 我将无法使用 net.msmq 绑定发送。
【问题讨论】:
-
如果您通过 HTTP 发送到事务队列,则发送方需要在本地安装支持 HTTP 的 MSMQ 才能接收目的地发回的 ACK 消息。发送到非事务队列不会。