2009-12-28 59 views
2

我有一个BizTalk 2006应用程序,它有一个使用MSMQ的发送端口。我也有一个WCF winforms托管应用程序与几个WCF服务(在开发环境中,在生产中我使用Windows服务作为托管)。带有MSMQIntegrationBinding的WCF不接收队列中的消息

我创建的一个WCF服务有一个MSMQIntegrationBinding(由于BizTalk不是WCF服务,所以NetMSMQBinding不可能)。

我看到邮件正确放置在远程队列上,因为我激活了邮件选项,并在邮件队列中看到邮件,但队列为空,WCF服务没有收到邮件。

任何人都可以给我一个线索在哪里看解决这个问题?

(编辑1):我已经做了一些调查研究在这个题目:

  • 当2006年的BizTalk通信R2与MSMQ,你必须使用MSMQIntegrationBinding因为NetMSMQBinding仅适用于WCF到WCF
  • 所以我被MSMQIntegrationBinding删除
  • MSMQIntegration绑定不使用DataContract序列化程序。相反,它会基于MsmqMessageSerializationFormat属性序列化数据。它的默认值是MsmqMessageSerializationFormat.Xml,这意味着将使用XmlSerializer。这背后的基本原理是,MSMQ集成传输是专门为与本机MSMQ/System互操作而设计的。信息化应用程序
  • 因为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进行序列化。

回答

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中的路径可由您的服务写入。

+0

感谢Daniel,我已经知道了,但是我在.config文件中引用了它;-)我将激活它以查看WCF日志。 – 2009-12-28 14:04:21

+0

丹尼尔,我授予你最有用的答案,通过查看跟踪信息很容易找到解决方案。 – 2009-12-28 21:37:43

+0

干得好Patrick。我很高兴你解决了它。 – 2009-12-28 21:44:46

1

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

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

检查事件日志,那里可能有错误,这将指出你在正确的方向。

+0

事件日志中没有错误。我正在调查队列名称是否必须与服务名称完全一致...... – 2009-12-28 12:22:42

1

您是否验证过该消息是否确实已由WCF服务留在队列中,还是正在被拾取并删除,而未被WCF处理?

我想尝试的是将一个处理程序附加到ServiceHost实例中的UnknownMessageReceived事件中,并查看是否在收到消息时触发该事件......这肯定会导致您的服务合同定义错误(它可能是你需要使用一个包罗万象的:

[OperationContract(Action="*")] 

,以确保它被正确地路由到您的方法