首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MSMQIntegrationBinding的WCF不会从队列中接收消息。

使用MSMQIntegrationBinding的WCF不会从队列中接收消息。
EN

Stack Overflow用户
提问于 2009-12-28 12:10:54
回答 3查看 2.5K关注 0票数 2

我有一个BizTalk 2006应用程序,它有一个使用MSMQ的sendport。

我还有一个winforms托管应用程序,它有几个WCF服务(在开发环境中,在生产中我使用一个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来生成数据类。因此,我必须通过hand....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,我创建了数据域类,因此这里没有手工操作;-)因此结论是对WCF服务方法中用作参数的数据契约类使用xsd.exe。这是因为MSMQIntegrationBinding迫使您使用XMLSerializer而不是默认的DataContractSerializer使所有数据域类型都可以序列化。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-28 13:43:42

您可能想尝试启用WCF跟踪。

它可以帮助你理解正在发生的事情和没有发生的事情。

下面是启用跟踪的.config示例。确保.config文件位于WCF服务主机的同一个文件夹中。

代码语言:javascript
复制
<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中的路径。

票数 1
EN

Stack Overflow用户

发布于 2009-12-28 12:15:02

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

也可能是由于配置错误,您的连接配置正确吗?

检查事件日志,那里可能有一个错误,这将指向正确的方向。

票数 1
EN

Stack Overflow用户

发布于 2009-12-28 13:23:11

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

我尝试的方法是将一个处理程序附加到UnknownMessageReceived实例中的ServiceHost事件,并查看在接收消息时是否触发了它.这将是一个确定的迹象,表明您的服务合同定义不正确(可能需要使用catch all:

代码语言:javascript
复制
[OperationContract(Action="*")]

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1969202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档