我有一个客户端应用程序将邮件放入名为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服务的已启用协议下
答案 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