2

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

<bindings>
    <customBinding>
        <binding name="MyCustomBinding">
            <!-- available encodings: -->
            <!-- <textMessageEncoding /> -->
            <!-- <binaryMessageEncoding /> -->
            <!-- <mtomMessageEncoding /> -->
            <!-- <webMessageEncoding /> -->

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

我想我仅限于四种预定义编码之一:textMessageEncoding, binaryMessageEncoding, mtomMessageEncoding, webMessageEncoding.

在客户端,我尝试更改格式化程序:

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();

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

提前致谢。

4

1 回答 1

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)。

出于这个原因,暴露数据合约(超出字符串)将没有意义。

我猜 MS 并没有真正想到人们会使用它来实现较低的 .Net 版本和 WCF 之间的互操作。

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

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

只要明确他们不应该实际调用 http 操作,或者让操作抛出 NotImplementedException。

于 2012-06-19T13:09:52.170 回答