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?
Danke für die Klarstellung. Der Link beschreibt genau das, wonach ich gesucht habe. –