2

我有一个 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 将所有数据协定类型设为可序列化。

4

3 回答 3

1

这里首先要检查的是 WCF 服务的权限。与消息队列的连接是否由允许连接到消息队列的帐户完成。

也可能是配置错误,你的连接配置是否正确?

检查事件日志,那里可能有错误,它将为您指明正确的方向。

于 2009-12-28T12:15:02.013 回答
1

您是否验证了消息是否确实被 WCF 服务留在队列中,或者它是否被 WCF 拾取并删除并且没有被 WCF 处理?

我会尝试将处理程序附加到 ServiceHost 实例中的UnknownMessageReceived事件,并查看它是否在接收消息时被触发......这肯定表明您的服务合同定义不正确(可能是你需要使用全部捕获:

[OperationContract(Action="*")]

以确保它正确路由到您的方法。

于 2009-12-28T13:23:11.343 回答
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 提供了一个服务跟踪查看器工具来读取 .svclog 文件。

initializeData确保您的服务可写入路径。

于 2009-12-28T13:43:42.457 回答