2012-06-19 68 views
2

我創建了一個使用MSMQ的WCF服務。
多個.NET客戶端應該能夠使用此服務並向其發送消息。
部分客戶端是在沒有WCF(例如.NET 1.1)的.NET版本中編寫的。
對於這些客戶端,我直接使用Msmq API。
問題是,消息的編碼不符合服務端的預期編碼。
所以,我試圖使用customBinding以改變在服務端的消息編碼:使用舊客戶端消耗WCF服務(使用MSMQ)

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

似乎沒有格式化適合於預期的編碼。 是否有統一編碼的另一種方法? 也許是一個自定義的編碼器或類似的東西? 還是我完全錯了調整格式化器和編碼器?

在此先感謝。

回答

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> 

UPDATE

一體化結合的整點是最大的互操作性,使WCF可以支持非。 Net msmq客戶端(ActiveX,Java)。

由於這個原因,暴露數據契約(超越字符串)不會有意義。

我想MS並不真的想象人們會用它來在較低的.Net版本和WCF之間進行互操作。

我可以建議的唯一的東西是託管一個mex端點,定義一組單向操作,通過http公開您的類型,然後允許客戶端從該端點使用wsdl。

然後,他們可以使用它來建立它們的本地類型定義,以便與您的msmq端點一起使用。

只要說清楚他們不應該實際調用http操作,或者讓操作拋出NotImplementedException。

+0

Thx。所以我必須聽第二個隊列並執行第二個合約,它需要一個'MsmqMessage '? –

+0

是的,在你的情況下,你將不得不針對不同版本的客戶端公開第二個端點,但我相當肯定你可以讓你的wcf客戶端使用傳統端點,只要它們匹配綁定即可。 –

+0

你知道我爲什麼在使用'msmqIntegrationBinding'時得到如此小的元數據嗎?我知道我不需要使用可用方法的服務代理,但數據合同很容易獲得。有任何想法嗎? –