我有一个 BizTalk 2006 应用程序,它有一个使用 MSMQ 的发送端口。
我还有一个带有多个 WCF 服务的 WCF winforms 托管应用程序(在开发环境中,在生产中我使用 Windows 服务作为托管)。
我创建的 WCF 服务之一有一个 MSMQIntegrationBinding(由于 BizTalk 不是 WCF 服务,因此 NetMSMQBinding 是不可能的)。
我看到消息已正确放置在远程队列中,因为我激活了日志选项并且我在日志队列中看到了消息,但是队列为空并且 WCF 服务没有接收消息。
任何人都可以给我一个线索来解决这个问题吗?
(编辑 1):我对这个主题做了更多的研究:
- 使用 MSMQ 与 BizTalk 2006 R2 通信时,您必须使用 MSMQIntegrationBinding,因为 NetMSMQBinding 仅适用于 WCF 到 WCF
- 所以我坚持使用 MSMQIntegrationBinding
- MSMQIntegration 绑定不使用 DataContract 序列化程序。相反,它基于 MsmqMessageSerializationFormat 属性序列化数据。它的默认值为 MsmqMessageSerializationFormat.Xml,这意味着将使用 XmlSerializer。这背后的基本原理是 msmq 集成传输是专门为与本机 MSMQ / System.Messaging 应用程序互操作而设计的
- 因为 MSMQIntegration 绑定使用普通的旧 XmlSerializer,所以我无法轻松使用 svcutil.exe 来生成我的数据类。所以我必须手动创建我的数据合同类....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 服务的诊断跟踪数据,消息由于反序列化异常而被丢弃。现在唯一的解决方案是手动创建数据合同类......
(编辑 3):通过使用 xsd.exe 工具而不是 svcutil.exe 我创建了 datacontract 类,所以这里没有手工工作;-) 所以结论是使用 xsd.exe 作为参数的数据协定类在 WCF 服务方法中。这是因为 MSMQIntegrationBinding 强制您使用 XMLSerializer 而不是默认的 DataContractSerializer 将所有数据协定类型设为可序列化。