【发布时间】:2010-12-30 11:08:58
【问题描述】:
我有一个 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 将所有数据合同类型设为可序列化。
【问题讨论】:
标签: wcf msmq msmqintegrationbinding