【问题标题】:Hosting MSMQ in IIS 6 and sending it messages via WCF在 IIS 6 中托管 MSMQ 并通过 WCF 向其发送消息
【发布时间】: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 消息。发送到非事务队列不会。

标签: wcf iis msmq


【解决方案1】:

您是正确的,您在 IIS6 中托管的 WCF 服务将无法处理这些消息。这是因为 IIS6 不使用 WAS 来为非 http 请求实例化进程。但我认为这是在您在工作流程中所做的一切之后发生的。我会期待

  • 您运行客户端,将消息推送到远程队列
  • 消息出现在远程队列中
  • 您的 WCF 服务确实接收消息,因为它托管在 IIS6 中,因此您在远程队列中留下了一条消息。

我完全不相信 IIS 会参与其中,直到它无论如何都无法工作。

对此的一个简单测试是在服务器上自行托管您的服务,例如在控制台应用程序中运行它。它将能够像 IIS7 一样接受 MSMQ 消息,并将其作为潜在问题从您的设备中删除。

您可能还想测试是否可以将消息直接从客户端推送到服务器上的事务队列。如果您在将消息发送到其他机器上的事务队列时遇到问题,那么您可以检查 MSDTC 日志。我不羡慕必须深入那里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-27
    • 2012-11-05
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    相关资源
    最近更新 更多