我正在开发一个必须支持向后兼容性的客户端 - 服务器应用程序(.NET 4 WPF,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"
我可以为同一个服务合同配置两个绑定配置 - 一个是基本配置,另一个是自定义配置,它们都指向同一个接口吗?我该如何解决这个问题?
答案 0 :(得分:12)
对于在不同地址公开并使用不同绑定对齐的同一服务,您基本上需要2个端点。 This可能会对您有所帮助。
答案 1 :(得分:0)
对于同一服务合同,您可以有两个不同的绑定,但是您需要在配置中创建单独的服务节点,并且还需要定义单独的端点。因此,为二进制格式化服务创建一个新端点,并让新版本的客户端引用它。