我有一个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-2e21d5638fa1和http://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进行序列化。
感谢Daniel,我已经知道了,但是我在.config文件中引用了它;-)我将激活它以查看WCF日志。 – 2009-12-28 14:04:21
丹尼尔,我授予你最有用的答案,通过查看跟踪信息很容易找到解决方案。 – 2009-12-28 21:37:43
干得好Patrick。我很高兴你解决了它。 – 2009-12-28 21:44:46