WCF: plusieurs configurations de liaison pour un seul service

Je suis en train de travailler sur une application client-serveur (.NET 4 WPF, WCF) qui doit prendre en charge la compatibilité ascendante. En d'autres termes, les anciens clients doivent être compatibles avec les nouveaux serveurs (et vice versa) pour l'exploitation de contrats et de contrats de données.

Nos services WCF sont hébergés dans IIS, et ils ont été configuré pour utiliser 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>

D'assumer le contrat est assez simple et ressemble à quelque chose comme ceci:

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

Récemment, j'ai découvert que nous pouvions changer notre encodage à partir de XML à binary. Combiné avec la compression IIS, c'est vraiment boosté les performances de notre WCF des méthodes telles que GetData énumérés ci-dessus.

Cet encodage changement exige aussi un changement dans le client et le serveur WCF liaisons, en passant d'un basicHttpBinding à un 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>

...

Voici le problème. Depuis notre logiciel doit prendre en charge le client/serveur de rétro-compatibilité, si un ancien client avec l'ancien basicHttpBinding tente de frapper un serveur avec la nouvelle customBindingl'appel échoue avec un décalage, par exemple "Content Type text/xml; charset=utf-8 was not supported by this service.... The client and service bindings may be mismatched"

Puis-je avoir deux configurations de liaison pour le même contrat de service - une et l'autre de la coutume, et ils pointent vers la même interface? Comment puis-je contourner cela?

source d'informationauteur John Russell