Domanda

Sto appena iniziando a creare alcuni servizi WCF, ma ho l'esigenza di renderli compatibili con le versioni precedenti per le applicazioni client legacy (.NET 1.1 e 2.0).

Sono riuscito a far funzionare correttamente i servizi per i client 3.0 e versioni successive, ma quando pubblico i servizi utilizzando un endpoint basicHttpBinding (che ritengo sia necessario per la compatibilità di cui ho bisogno), il servizio esegue il refactoring delle firme dei miei metodi.per esempio.

public bool MethodToReturnTrue(string seedValue);

appare alle app client come

public void MethodToReturnTrue(string seedValue, out bool result, out bool MethodToReturnTrueResultSpecified);

Ho provato tutti i parametri di configurazione che mi vengono in mente in app.config per la mia app console self-hosting, ma non riesco a eseguire questa funzione come previsto.Suppongo che ciò potrebbe portare al fatto che le mie aspettative sono imperfette, ma sarei sorpreso che un servizio WCF non sia in grado di gestire un tipo di ritorno bool a un client di livello inferiore.

Il mio attuale app.config assomiglia a questo.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>  
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="MyServiceTypeBehaviors" Name="MyCompany.Services.CentreService.CentreService">
        <clear />
        <endpoint address="http://localhost:8080/CSMEX"    binding="basicHttpBinding" bindingConfiguration="" contract="IMetadataExchange" />
        <endpoint address="http://localhost:8080/CentreService" binding="basicHttpBinding" bindingName="Compatible" name="basicEndpoint" contract="MyCompany.Services.CentreService.ICentreService" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceTypeBehaviors" >
            <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Qualcuno può consigliare, per favore?

È stato utile?

Soluzione 2

OK, dovevamo risolvere questo problema a breve termine, quindi ci è venuta l'idea di un "interoperabilità" o livello di compatibilità.

In pratica, tutto ciò che abbiamo fatto è stato aggiungere un servizio Web ASMX tradizionale al progetto e chiamare il servizio WCF da quello utilizzando chiamate WCF native.Siamo quindi stati in grado di restituire i tipi appropriati alle applicazioni client senza una quantità significativa di lavoro di refactoring.So che era una soluzione complicata, ma era l'opzione migliore che avevamo con una base di codice legacy così ampia.E il vantaggio aggiuntivo è che funziona davvero sorprendentemente bene.:)

Altri suggerimenti

Ah, questo mi sta uccidendo!L'ho fatto al lavoro circa 3 mesi fa e ora non riesco a ricordare tutti i dettagli.

Ricordo, tuttavia, che è necessario basicHttpBinding e non è possibile utilizzare il nuovo serializzatore (che è l'impostazione predefinita);devi usare il "vecchio" XmlSerializer.

Sfortunatamente, non lavoro più nel posto in cui l'ho fatto, quindi non posso andare a guardare il codice.Chiamerò il mio capo e vedrò cosa riesco a scoprire.

Devi usare XmlSerializer.Per esempio:

[ServiceContract(Namespace="CentreServiceNamespace")]
[XmlSerializerFormat(Style=OperationFormatStyle.Document, SupportFaults=true, Use=OperationFormatUse.Literal)]
public interface ICentreService {
    [OperationContract(Action="CentreServiceNamespace/MethodToReturnTrue")]
    bool MethodToReturnTrue(string seedValue);
}

È necessario impostare manualmente il nome dell'azione dell'operazione perché il nome WCF generato automaticamente è costruito in modo diverso dal nome dell'azione ASMX (WCF include anche il nome dell'interfaccia, ASMX no).

Tutti i contratti dati che utilizzi dovrebbero essere decorati [XmlType] piuttosto che [DataContract].

Non dovrebbe essere necessario modificare il file di configurazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top