我创建了一个使用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>
我想我被限制为四种预先定义的编码中的一种: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();
似乎没有格式化程序符合预期的编码。 还有另一种统一编码的方法吗? 也许是自定义编码器或类似的东西? 或者我调整格式化程序和编码器完全错了吗?
提前致谢。
答案 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。