2013-06-19 18 views
11

Sto lavorando a un'applicazione client-server (.NET 4 WPF, WCF) che deve supportare la retrocompatibilità. In altre parole, i vecchi client dovrebbero essere compatibili con i nuovi server (e viceversa) per quanto riguarda i contratti operativi e i contratti di dati.WCF: più configurazioni di rilegatura per un singolo servizio

I nostri servizi WCF sono ospitati in IIS, e stati impostati per utilizzare 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> 

Assumere il contratto è piuttosto semplice e simile a questa:

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

Recentemente , Ho scoperto che potremmo cambiare la nostra codifica da XML a binary. Combinato con la compressione di IIS, questo ha davvero migliorato le prestazioni dei nostri metodi WCF come GetData elencati sopra.

Questo cambiamento di codifica richiedeva anche una modifica dei collegamenti WCF client e server, passando da un basicHttpBinding a 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> 

... 

Ecco il problema. Poiché il nostro software deve supportare la compatibilità con i client/server all'indietro, se un vecchio client con il vecchio basicHttpBinding tenta di colpire un server con il nuovo customBinding, la chiamata fallirà con una mancata corrispondenza, ad es. "Content Type text/xml; charset=utf-8 was not supported by this service.... The client and service bindings may be mismatched"

Posso avere due configurazioni di rilegatura per lo stesso contratto di servizio, una di base e l'altra personalizzata, ed entrambe puntano alla stessa interfaccia? Come posso aggirare questo?

risposta

9

Fondamentalmente sono necessari 2 endpoint per lo stesso servizio esposto a indirizzi diversi e allineati con associazioni diverse. This potrebbe aiutarti.

+0

Grazie per il chiarimento. Il link era esattamente descrive esattamente quello che stavo cercando. –

0

È possibile avere 2 due collegamenti diversi per lo stesso contratto di servizio, ma nella configurazione sarà necessario creare nodi di servizio separati e sarà necessario definire endpoint separati. Crea quindi un nuovo endpoint per il servizio in formato binario e fai riferimento alla nuova versione del client.

Problemi correlati