我有一个BizTalk 2006应用程序,它有一个使用MSMQ的sendport。
我还有一个winforms托管应用程序,它有几个WCF服务(在开发环境中,在生产中我使用一个windows服务作为宿主)。
我创建的WCF服务之一有一个MSMQIntegrationBinding (因为BizTalk不是WCF服务,所以NetMSMQBinding是不可能的)。
我看到消息被正确地放置在远程队列上,因为我激活了日志选项,我在日志队列中看到了消息,但是队列是空的,WCF服务没有接收消息。
有人能给我一个解决这个问题的线索吗?
(编辑1):我已经对这个主题做了更多的研究:
(参考: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,我创建了数据域类,因此这里没有手工操作;-)因此结论是对WCF服务方法中用作参数的数据契约类使用xsd.exe。这是因为MSMQIntegrationBinding迫使您使用XMLSerializer而不是默认的DataContractSerializer使所有数据域类型都可以序列化。
发布于 2009-12-28 13:43:42
您可能想尝试启用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>微软提供了一个服务跟踪查看器工具来读取.svclog文件。
确保您的服务可以写入initializeData中的路径。
发布于 2009-12-28 12:15:02
这里首先要检查的是WCF服务的权限。由允许连接到消息队列的帐户执行到消息队列的连接。
也可能是由于配置错误,您的连接配置正确吗?
检查事件日志,那里可能有一个错误,这将指向正确的方向。
发布于 2009-12-28 13:23:11
您是否验证了WCF服务是否确实将消息留在队列中,或者它是否被拾取和删除,只是没有被WCF处理?
我尝试的方法是将一个处理程序附加到UnknownMessageReceived实例中的ServiceHost事件,并查看在接收消息时是否触发了它.这将是一个确定的迹象,表明您的服务合同定义不正确(可能需要使用catch all:
[OperationContract(Action="*")]以确保它被正确地路由到您的方法。
https://stackoverflow.com/questions/1969202
复制相似问题