Message Queue 服务消息未到达

Message Queue service messages don't arrive

我通过消息队列获得了这个 WCF 服务。

服务配置如下:

  <service name="EmailServices.EmailService" behaviorConfiguration="serviceBehaviour">
    <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" name="mexEmailService" contract="IMetadataExchange" />
    <endpoint name="netMsmqEmailService" address="net.msmq://w2k8services/emailservices_w2k8services" contract="EmailServices.IEmailService"
            binding="netMsmqBinding" bindingConfiguration="netMsmq" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8008/EmailService" />
      </baseAddresses>
    </host>
  </service>

这样的绑定

  <netMsmqBinding>
    <binding name="netMsmq" exactlyOnce="true" receiveErrorHandling="Move" receiveTimeout="00:45:00" maxReceivedMessageSize="2147483647">
      <security mode="None" />
    </binding>   

非常基本的消息队列服务,在本地运行良好

生成代理并调用函数后,消息并没有到达服务。停止服务时,它们不会进入任何队列,尽管有时您会看到一个很快出现在客户端机器的传出队列中

跟踪文件显示一切正常,只是无法查看是否是事务性的。这是...

我不知道该尝试什么了,我会说它应该有效,但事实并非如此。 我还能尝试什么?

...sometimes you see one shortly appear in the outgoing queue of the client machine

这意味着客户端成功地将消息排入队列并且消息正在从一台机器传输到另一台机器(假设这是一个事务性队列 - 它需要像您指定的那样 "exactlyOnce"在你的绑定中)。

因此,假设事务排队,问题一定出在接收端。

首先要检查的是队列权限。要接收消息,服务帐户 运行 服务需要以下队列权限:

  • 收到
  • 偷看
  • 获取权限
  • 获取属性

如果这些都答应了,那么接下来就是enable msmq event logging了。您应该能够在机器上看到消息到达的事件。之后的任何问题,您应该可以使用此日志查看。

检查您要发送的消息的长度。

WCF 默认只发送 8192 个字符。

如果要发送超过8192个字符,则需要更改。

我遇到了类似的问题,这对我有用。