我有一个BizTalk 2006应用程序,它有一个使用MSMQ的sendport。
我还有一个带有几个WCF服务的WCF winforms托管应用程序(在开发环境中,在生产中我使用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服务的诊断跟踪数据,并且由于反序列化异常而丢弃了该消息。现在唯一的解决方案是手工创建datacontract类......
(编辑3):通过使用xsd.exe工具而不是svcutil.exe我创建了datacontract类,所以这里没有手工工作;-)所以结论是使用xsd.exe进行数据合约类用作WCF服务方法中的参数。这是因为MSMQIntegrationBinding强制您使用XMLSerializer而不是默认的DataContractSerializer使所有datacontract类型可序列化。
答案 0 :(得分:1)
首先要检查的是WCF服务的权限。与消息队列的连接是否由允许连接到消息队列的帐户完成。
也可能是由于配置错误,您的连接配置是否正确?
检查事件日志,可能会出现错误,这会指向正确的方向。
答案 1 :(得分:1)
您是否已验证WCF服务是否确实将消息留在队列中,或者是否正在拾取和删除该消息而WCF尚未处理该消息?
我要尝试的是将一个处理程序附加到ServiceHost实例中的UnknownMessageReceived事件,并查看它是否在被捕获时被触发...这将是您的服务合同的确定标志定义不正确(可能需要使用全部捕获:
[OperationContract(Action="*")]
确保将其正确路由到您的方法。
答案 2 :(得分: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
中的路径。