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 customBinding
l'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
Vous devez vous connecter pour publier un commentaire.
En gros, vous avez besoin de 2 points de terminaison pour le même service exposés à des adresses différentes, et alignés sur les différentes liaisons.
Cette peut vous aider.
Vous pouvez avoir 2 deux différentes liaisons pour le même contrat de service, mais vous aurez besoin de créer des nœuds de service dans la config et vous aurez également besoin de séparer les points de terminaison définis. Afin de créer un nouveau point de terminaison pour le binaire formaté service, et la nouvelle version de la référence du client.