将WCF服务(使用MSMQ)与旧客户端一起使用

时间:2012-06-19 09:15:42

标签: wcf encoding msmq

我创建了一个使用MSMQ的WCF服务 多个.NET客户端应该能够使用此服务并向其发送消息 部分客户端是用.NET版本编写的,其中没有WCF(例如.NET 1.1) 对于这些客户,我直接使用Msmq API 问题是,消息的编码不符合服务端的预期编码 所以我尝试使用customBinding

更改服务端的消息编码
<bindings>
    <customBinding>
        <binding name="MyCustomBinding">
            <!-- available encodings: -->
            <!-- <textMessageEncoding /> -->
            <!-- <binaryMessageEncoding /> -->
            <!-- <mtomMessageEncoding /> -->
            <!-- <webMessageEncoding /> -->

            <msmqTransport ...>
                <msmqTransportSecurity ... />
            </msmqTransport>
        </binding>
    </customBinding>
</bindings>

我想我被限制为四种预先定义的编码中的一种:textMessageEncodingbinaryMessageEncodingmtomMessageEncodingwebMessageEncoding

在客户端,我试图改变格式化程序:

System.Messaging.Message msmqMessage = new System.Messaging.Message();
msmqMessage.Formatter = new System.Messaging.ActiveXMessageFormatter();
//msmqMessage.Formatter = new System.Messaging.BinaryMessageFormatter();
//msmqMessage.Formatter = new System.Messaging.XMLMessageFormatter();

似乎没有格式化程序符合预期的编码。 还有另一种统一编码的方法吗? 也许是自定义编码器或类似的东西? 或者我调整格式化程序和编码器完全错了吗?

提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以使用内置的MsmqIntegrationBinding并将序列化格式设置为xml:

<service name="MyQueueListenner">
    <endpoint address="msmq.formatname:DIRECT=OS:.\private$\myQueue"
              binding="msmqIntegrationBinding"
              bindingConfiguration="DotNetBinding"
              contract="MyContract" />
  </service>
  ...

  <msmqIntegrationBinding>
    <binding serializationFormat="Xml" name="DotNetBinding" durable="false" exactlyOnce="false">
      <security mode="None" />
    </binding>
  </msmqIntegrationBinding>

<强>更新

集成绑定的重点是最大的互操作性,以便wcf可以支持非.Net msmq客户端(ActiveX,Java)。

因此,暴露数据合同(超出String)将没有意义。

我想MS并不是真的想象人们会用它来在较低的.Net版本和WCF之间进行互操作。

我唯一可以建议的是托管一个mex端点,定义一组单向操作,通过http公开你的类型,然后允许客户端使用来自这个端点的wsdl。

然后,他们可以使用它来构建本地类型定义,以便与msmq端点一起使用。

说清楚他们不应该实际调用http操作,或者让操作抛出NotImplementedException。