带有MSMQIntegrationBinding的WCF不会从队列中获取消息

时间:2009-12-28 12:10:54

标签: wcf msmq msmqintegrationbinding

我有一个BizTalk 2006应用程序,它有一个使用MSMQ的sendport。

我还有一个带有几个WCF服务的WCF winforms托管应用程序(在开发环境中,在生产中我使用Windows服务作为托管)。

我创建的一个WCF服务有一个MSMQIntegrationBinding(由于BizTalk不是WCF服务,因此无法使用NetMSMQBinding)。

我看到消息已正确放置在远程队列上,因为我激活了日志选项,我在日志队列中看到了消息,但队列是空的,WCF服务没有收到消息。

有人能告诉我在哪里解决这个问题?

(编辑1):我对这个主题做了更多的研究:

  • 与BizTalk 2006 R2与MSMQ通信时,您必须使用MSMQIntegrationBinding,因为NetMSMQBinding仅适用于WCF到WCF
  • 所以我坚持使用MSMQIntegrationBinding
  • MSMQIntegration绑定不使用DataContract序列化程序。相反,它基于MsmqMessageSerializationFormat属性序列化数据。它的默认值是MsmqMessageSerializationFormat.Xml,这意味着将使用XmlSerializer。这背后的基本原理是msmq集成传输专门设计用于与本机MSMQ / System.Messaging应用程序互操作
  • 因为MSMQIntegration绑定使用普通的旧XmlSerializer,所以我没有简单的能力使用svcutil.exe来生成我的数据类。所以我必须手工创建我的datacontract类.... pfffffffffff

(参考:http://social.msdn.microsoft.com/Forums/en/wcf/thread/2d48fe90-5c2a-4156-8a3f-2e21d5638fa1http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/

(编辑2):

我检查了来自WCF服务的诊断跟踪数据,并且由于反序列化异常而丢弃了该消息。现在唯一的解决方案是手工创建datacontract类......

(编辑3):通过使用xsd.exe工具而不是svcutil.exe我创建了datacontract类,所以这里没有手工工作;-)所以结论是使用xsd.exe进行数据合约类用作WCF服务方法中的参数。这是因为MSMQIntegrationBinding强制您使用XMLSerializer而不是默认的DataContractSerializer使所有datacontract类型可序列化。

3 个答案:

答案 0 :(得分:1)

首先要检查的是WCF服务的权限。与消息队列的连接是否由允许连接到消息队列的帐户完成。

也可能是由于配置错误,您的连接配置是否正确?

检查事件日志,可能会出现错误,这会指向正确的方向。

答案 1 :(得分:1)

您是否已验证WCF服务是否确实将消息留在队列中,或者是否正在拾取和删除该消息而WCF尚未处理该消息?

我要尝试的是将一个处理程序附加到ServiceHost实例中的UnknownMessageReceived事件,并查看它是否在被捕获时被触发...这将是您的服务合同的确定标志定义不正确(可能需要使用全部捕获:

[OperationContract(Action="*")]

确保将其正确路由到您的方法。

答案 2 :(得分:1)

您可能想尝试启用WCF跟踪。

它可以帮助您了解正在发生的事情以及未发生的事情。

以下是启用跟踪的.config示例。确保.config文件位于WCF服务主机的同一文件夹中。

<configuration>
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Warning" 
              propagateActivity="true" >
        <listeners>
          <add name="xml"/>
        </listeners>
      </source>

      <source name="myUserTraceSource" switchValue="Warning, ActivityTracing">
        <listeners>
          <add name="xml"/>
        </listeners>
      </source>
    </sources>

    <sharedListeners>
      <add name="xml" 
           type="System.Diagnostics.XmlWriterTraceListener" 
           initializeData="C:\trace_logs\TraceLog.svclog" />
    </sharedListeners>

  </system.diagnostics>
</configuration>

Microsoft提供Service Trace Viewer Tool来读取.svclog文件。

确保您的服务可以写入initializeData中的路径。