我正在研究必須支持向後兼容性的客戶端服務器應用程序(.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"
我可以有相同的服務合同兩種結合配置 - 一個基本和其他自定義,並且它們都指向相同的接口?我該如何解決這個問題?
感謝您的澄清。該鏈接完全描述了我正在尋找的內容。 –