2013-06-19 9 views
11

Ich arbeite an einer Client-Server-Anwendung (.NET 4 WPF, WCF), die Abwärtskompatibilität unterstützen muss. Mit anderen Worten, alte Clients sollten mit neuen Servern kompatibel sein (und umgekehrt), was Betriebsverträge und Datenverträge betrifft.WCF: Mehrere Bindungskonfigurationen für einen einzelnen Dienst

Unsere WCF-Dienste sind in IIS gehostet wird, und sie wurden eingerichtet Basichttpbinding zu verwenden:

<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> 

der Vertrag ziemlich einfach sei angenommen und sieht etwa so aus:

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

Kürzlich Ich entdeckte, dass wir unsere Codierung von XML zu binary ändern konnten. In Kombination mit der IIS-Komprimierung hat dies die Leistung unserer oben aufgeführten WCF-Methoden wie GetData erheblich gesteigert.

Diese Kodierungsänderung erforderte auch eine Änderung der Client- und Server-WCF-Bindungen, wobei von basicHttpBinding auf customBinding umgeschaltet wurde.

<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> 

... 

Hier ist das Problem. Da unsere Software die Client/Server-Abwärtskompatibilität unterstützen muss, wenn ein alter Client mit dem alten basicHttpBinding versucht, einen Server mit dem neuen customBinding zu treffen, wird der Aufruf mit einer Nichtübereinstimmung fehlschlagen, z. "Content Type text/xml; charset=utf-8 was not supported by this service.... The client and service bindings may be mismatched"

Kann ich zwei verbindliche Konfigurationen für den gleichen Servicevertrag haben - eine grundlegende und die andere benutzerdefinierte, und beide verweisen auf die gleiche Schnittstelle? Wie kann ich das umgehen?

Antwort

9

Sie benötigen grundsätzlich zwei Endpunkte für denselben Dienst, die an verschiedenen Adressen verfügbar sind und mit verschiedenen Bindungen ausgerichtet sind. This kann Ihnen helfen.

+0

Danke für die Klarstellung. Der Link beschreibt genau das, wonach ich gesucht habe. –

0

Sie können zwei verschiedene Bindungen für denselben Servicevertrag haben, aber Sie müssen separate Service-Knoten in der Konfiguration erstellen, und Sie müssen auch separate Endpunkte definieren. Erstellen Sie daher einen neuen Endpunkt für den binär formatierten Dienst und lassen Sie ihn von der neuen Version des Clients referenzieren.

Verwandte Themen