WCF:单个服务的多个绑定配置

Posted

技术标签:

【中文标题】WCF:单个服务的多个绑定配置【英文标题】:WCF: Multiple binding configurations for a single service 【发布时间】:2013-06-16 14:27:33 【问题描述】:

我正在开发一个必须支持向后兼容性的客户端-服务器应用程序(.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"

我能否为同一个服务合同提供两种绑定配置——一种是基本的,另一种是自定义的,并且它们都指向同一个接口?我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

对于在不同地址公开并与不同绑定对齐的同一服务,您基本上需要 2 个端点。 This 可以帮到你。

【讨论】:

感谢您的澄清。该链接准确地描述了我正在寻找的内容。【参考方案2】:

您可以为同一个服务合同拥有 2 个不同的绑定,但是您需要在配置中创建单独的服务节点,并且您还需要定义单独的端点。因此,为二进制格式的服务创建一个新端点,并让新版本的客户端引用它。

【讨论】:

以上是关于WCF:单个服务的多个绑定配置的主要内容,如果未能解决你的问题,请参考以下文章

如何将单个 WCF 服务配置为具有多个 HTTP 和 HTTPS 端点?

如何配置 WCF 服务以同时使用 HTTP 和 HTTPS - 多个绑定不起作用

WCF IIS 托管服务由单个服务实现的多个服务合同 - 如何通过配置在端点之间共享 uri

如何使用多个绑定将 WCF json 绑定到 https?

为 WCF 服务添加多个 HTTP 基地址

将 WCF 服务的编程配置转换为配置文件