Подтвердить что ты не робот

WCF: несколько конфигураций привязки для одной службы

Я работаю над клиент-серверным приложением (.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"

Могу ли я иметь две конфигурации привязки для одного и того же контракта на обслуживание - один базовый и другой пользовательский, и оба они указывают на один и тот же интерфейс? Как я могу обойти это?

4b9b3361

Ответ 1

В основном вам нужны две конечные точки для одной и той же службы, выставленной на разных адресах и согласованной с разными привязками. Это может помочь вам.

Ответ 2

У вас может быть два разных привязки для одного и того же контракта на обслуживание, но вам нужно создать отдельные служебные узлы в конфиге, и вам также понадобятся отдельные конечные точки. Итак, создайте новую конечную точку для двоичной форматированной службы и предложите новую версию клиента.