2013-06-19 62 views
11

我正在研究必須支持向後兼容性的客戶端服務器應用程序(.NET 4 WPF,WCF)。換句話說,就運營合同和數據合同而言,舊客戶應該與新服務器兼容(反之亦然)。WCF:單個服務的多個綁定配置

我們的WCF服務託管在IIS和他們分別設立使用basicHttpBinding的:

<basicHttpBinding> 
    <binding name="basicHttpBinding_Configuration" maxBufferSize="2147483647" 
     maxReceivedMessageSize="2147483647"> 
     <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
     maxArrayLength="2147483647" /> 
     <security mode="None" /> 
    </binding> 
</basicHttpBinding> 

... 

<service behaviorConfiguration="SampleGateway.Data.DataAccessBehavior" 
    name="SampleGateway.Data.DataAccess"> 
    <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpBinding_Configuration" 
     contract="Sample.Data.IDataAccess" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:8731/Design_Time_Addresses/SampleGateway/SampleGateway.Data.DataAccess.svc" /> 
     </baseAddresses> 
    </host> 
</service> 

... 

<behavior name="SampleGateway.Data.DataAccessBehavior"> 
    <serviceMetadata httpGetEnabled="true" /> 
    <serviceDebug includeExceptionDetailInFaults="false" /> 
    <dataContractSerializer maxItemsInObjectGraph="2147483647" /> 
</behavior> 

承擔合同是非常基本的,看起來是這樣的:

[ServiceContract] 
public interface IDataAccess 
{ 
    [OperationContract] 
    List<Data> GetData(List<int> ids, DateTime startDateTime, DateTime endDateTime); 
} 

最近,我發現我們可以將我們的編碼從XML更改爲binary。結合IIS壓縮,這確實提高了我們的WCF方法(如上面列出的GetData)的性能。

此編碼更改還需要更改客戶端和服務器WCF綁定,從basicHttpBinding切換到customBinding

<customBinding > 
    <binding name="binaryHttpBinding_Configuration"> 
     <binaryMessageEncoding maxReadPoolSize="2147483647" maxSessionSize="2147483647" maxWritePoolSize="2147483647"> 
     <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="2147483647"/> 
     </binaryMessageEncoding> 
     <httpTransport transferMode="Streamed" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" useDefaultWebProxy="true"/> 
    </binding> 
</customBinding> 

... 

<service behaviorConfiguration="SampleGateway.Data.DataAccessBehavior" 
    name="SampleGateway.Data.DataAccess"> 
    <endpoint address="" binding="customBinding" bindingConfiguration="binaryHttpBinding_Configuration" 
     contract="CEMLink.Data.IDataAccess" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:8731/Design_Time_Addresses/SampleGateway/SampleGateway.Data.DataAccess.svc" /> 
     </baseAddresses> 
    </host> 
</service> 

... 

問題出在這裏。由於我們的軟件必須支持客戶端/服務器的向後兼容性,如果舊的客戶端與舊的basicHttpBinding嘗試擊中具有新的customBinding的服務器,則該呼叫將失敗並出現不匹配。 "Content Type text/xml; charset=utf-8 was not supported by this service.... The client and service bindings may be mismatched"

我可以有相同的服務合同兩種結合配置 - 一個基本和其他自定義,並且它們都指向相同的接口?我該如何解決這個問題?

回答

9

您基本上需要2個端點用於暴露在不同地址並與不同綁定對齊的相同服務。 This可能會幫助你。

+0

感謝您的澄清。該鏈接完全描述了我正在尋找的內容。 –

0

你可以有2個兩個不同的相同的服務合同綁定,但你需要創建在配置單獨的服務節點,你還需要定義不同的端點。因此,爲二進制格式的服務創建一個新的端點,並讓新版本的客戶端引用它。