Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用传统客户端的WCF服务(使用MSMQ)_Wcf_Encoding_Msmq - Fatal编程技术网

使用传统客户端的WCF服务(使用MSMQ)

使用传统客户端的WCF服务(使用MSMQ),wcf,encoding,msmq,Wcf,Encoding,Msmq,我创建了一个使用MSMQ的WCF服务。 多个.NET客户端应该能够使用此服务并向其发送消息。 部分客户端是在没有WCF的.NET版本中编写的(例如.NET 1.1)。 对于这些客户端,我直接使用Msmq API。 问题是,消息的编码不符合服务端的预期编码。 因此,我尝试使用customBinding更改服务端的消息编码: <bindings> <customBinding> <binding name="MyCustomBinding">

我创建了一个使用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>
似乎没有适合预期编码的格式化程序。 有没有其他统一编码的方法? 也许是定制编码器或类似的东西? 还是我在调整格式化程序和编码器方面完全错了


提前感谢。

您可以使用内置的
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)

因此,公开数据契约(字符串之外)将没有意义

我猜微软并没有真的想象人们会用它在较低的.Net版本和WCF之间进行互操作

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

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


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

Thx。因此,我必须听第二个队列并执行第二个契约,该契约接受
MsmqMessage
?是的,在您的情况下,您必须为不同版本的客户端公开第二个端点,虽然我非常确定,通过让wcf客户端与绑定匹配,您也可以让它们使用旧端点。您知道为什么我在使用
msmqIntegrationBinding
时得到的元数据很少吗?我知道我不需要一个具有可用方法的服务代理,但是数据契约很容易获得。有什么想法吗?
<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>