【问题标题】:WCF with MSMQIntegrationBinding does not pick up a message from queue带有 MSMQIntegrationBinding 的 WCF 不会从队列中获取消息
【发布时间】: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-2e21d5638fa1http://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


    【解决方案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 中的路径可被您的服务写入。

    【讨论】:

    • 感谢 Daniel,我已经知道了,但我已经在 .config 文件中引用了它;-) 我将激活它以查看 WCF 日志。
    • Daniel,我认为您的回答最有用,通过查看跟踪信息很容易找到解决方案。
    • 我想知道您在跟踪日志中看到的帮助您解决此问题的内容?它也可能对我有帮助。
    • 诸如此类的答案并没有真正的帮助,因为它们没有回答问题。它更像是一个如何调试,可以应用于任何事情。
    【解决方案2】:

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

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

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

    【讨论】:

    • 事件日志中没有错误。我正在调查队列名称是否必须与服务名称完全相同...
    【解决方案3】:

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

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

    [OperationContract(Action="*")]
    

    为了确保它被正确地路由到你的方法。

    【讨论】:

      猜你喜欢
      • 2012-01-26
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      相关资源
      最近更新 更多