wcf使用net.msmq绑定的服务不会从本地队列中获取消息

时间:2012-12-03 22:26:17

标签: iis msmq

我有一个客户端应用程序将邮件放入名为MsmqService / MsmqService.svc的私有队列。

在IIS中在默认网站下,我添加了带有net.msmq绑定的wcf服务。

我确保队列设置为事务性

以下是客户端应用程序和wcf上的相关配置部分。

<system.serviceModel>
    <bindings>
      <netMsmqBinding>
        <binding name="MsmqBindingNonTransactionalNoSecurity" exactlyOnce="false">
          <security mode="None"/>
        </binding>
        <binding name="MsmqBindingNonTransactionalTransportSecurity" exactlyOnce="false">
          <security mode="Transport"/>
        </binding>
        <binding name="MsmqBindingTransactionalTransportSecurity" exactlyOnce="true" receiveErrorHandling="Move">
          <security mode="Transport"/>
        </binding>
      </netMsmqBinding>
    </bindings>
    <services>
      <service name="MsmqService.MsmqService">
        <endpoint address="net.msmq://localhost/private/MsmqService/MsmqService.svc" binding="netMsmqBinding" 
                  bindingConfiguration="MsmqBindingTransactionalTransportSecurity" contract="MsmqContract.IMsmqContract"/>
      </service>
    </services>
  </system.serviceModel>

我在默认网站的已启用协议下使用了net.msmq,并且在wcf服务的已启用协议下

2 个答案:

答案 0 :(得分:1)

这可能是因为您使用IIS来托管服务。 IIS在不活动期间卸载工作进程,这意味着当一个消息到达时,将没有可用于消息消息的进程。

要在IIS中托管compliated at best。更好地托管Windows服务,更简单。

答案 1 :(得分:0)

我们遇到过几个与WCF相同的问题。 MSMQ。一旦App Pool长时间闲置,由于某种原因WAS Listener停止工作。因此,WCF服务不会获取队列中的消息。

为了解决这个问题,我们在同一服务上公开了另一个合同,没有IsOneWay = true (因为此操作不会与队列交互)。然后创建一个Windows服务,在一段指定的时间间隔后ping WCF服务URL,这可确保WAS进程始终处于活动状态,并且一旦队列中有消息,WCF就会收到消息。这是一篇详细解释How to resolve MSMQ WCF issue for service deactivation的文章  

另外,确保http和&amp; IIS上的应用程序启用了net.msmq协议。

使用Net.Msmq绑定实现WCF和MSMQ的分步指南的另一篇好文章 Setup MSMQ with WCF using Net.Msmq binding