2009-07-22 8 views
16

Fondamentalmente, ho un tipo di server "Foo" con i membri X e Y. Ogni volta che utilizzo il "Aggiungi riferimento server" di Visual Studio, vedo il WSDL e il proxy generato entrambi aggiungere la parola "Campo" a tutti i membri e cambia l'involucro della prima lettera. IE, "X" e "Y" vengono rinominati "xField" e "yField". Qualche idea sul perché questo sta accadendo? Non riesco a capire il modello.Perché a volte WCF aggiunge "Campo" alla fine dei tipi di proxy generati?

Dettagli: dispongo di un servizio Web ASMX legacy che espone un tipo "Foo". Ho creato un nuovo servizio WCF che è un involucro attorno a quel vecchio servizio web: il nuovo servizio avvolge solo quei metodi e forse aggiorna i valori di alcuni campi, ma espone gli stessi identici metodi e restituisce gli stessi identici tipi. Ho provato a ricreare i riferimenti più volte e, sempre, sempre rinomina i miei campi: la variabile "STUFF" è esposta in wsdl e proxy come "sTUFFField". La variabile "X" è esposta come "xField", ecc.

La cosa divertente è che non riesco a capire il modello - Ho provato a creare un nuovo servizio Web ASMX come test e wrapping che - le variabili non vengono rinominate poi. Quindi non riesco a capire il motivo del perché/quando WCF rinomina le variabili.

Qualcuno sa?

+0

Ha importanza? Se è così, _come_ importa? –

+2

È importante. Ho due casi d'uso (per utenti interni o esterni). Gli utenti interni possono ignorare il mio servizio wrapper e passare direttamente al servizio legacy sottostante (bypassando quindi la necessità di accedere). Gli utenti esterni devono passare attraverso il servizio wrapper e dargli una password, ecc. Ma poiché i servizi interni ed esterni ora danno nomi diversi ai campi, non posso condividere lo stesso codice per parlare con entrambi i servizi. Ho bisogno di scrivere diverse versioni del codice per ogni servizio. – tavistmorph

risposta

3

In genere, il proxy generato avrà "XField" e "YField" come campi interni/protetti/privati ​​ed esporrà i valori tramite le proprietà denominate "X" e "Y". Ci sono opzioni che puoi impostare quando crei il client proxy per modificarlo a tuo piacimento, penso.

AGGIORNAMENTO: Non riesco a trovare alcun interruttore o opzione per controllare questo comportamento. Potrebbe dipendere da quale serializzatore (DataContractSerializer vs XmlSerializer) WCF utilizza per creare il proxy client.

Alla fine, è più o meno solo un problema di stile di codifica: dal punto di vista funzionale, non dovrebbe fare la differenza.

Marc

+0

Esatto, è così che funziona NORMALY, ma vedo che i campi pubblici sono stati rinominati. Quindi i campi interni sono chiamati "XFieldField" e l'accessor pubblico è chiamato "XField". Non è quello che voglio, e significa che l'interfaccia con il servizio wrapper diventa diversa dall'interfaccia al servizio effettivo. Quindi non posso più trattare i due servizi in modo intercambiabile. – tavistmorph

+0

THAT è strano e inaspettato: come si crea il proxy client? In Visual Studio o usando svcutil.exe ?? –

+0

Esatto - strano e inaspettato. Sta succedendo solo su questo progetto, quindi non riesco a capire il modello. Ma ho creato il proxy client con Visual Studio, semplicemente facendo clic su "Aggiungi riferimento servizio". – tavistmorph

4

Ho avuto lo stesso problema, ma sono stato in grado di trovare una soluzione.

Nell'interfaccia se si aggiunge il tag [DataContractFormat] si finirà con il caso "XFieldField". Ma se lo sostituisci con [XmlSerializerFormat] nell'interfaccia non cambierà i nomi nel proxy generato.

19

Ho avuto lo stesso problema e la risposta di sergiosp mi ha indirizzato nella giusta direzione. Aggiungendo solo alcune informazioni aggiuntive per aiutare eventualmente qualcun altro.

Aggiunta di [System.ServiceModel.XmlSerializerFormatAttribute()] all'interfaccia e la rigenerazione del codice client ha risolto il problema per me.

public interface IMyService 
{ 
    [System.ServiceModel.XmlSerializerFormatAttribute()] 
    [System.ServiceModel.OperationContract] 
    recordResponse GetRecord(recordRequest request); 

} 
+0

grazie per l'aiuto. Ha risolto anche per me, ma hai idea di cosa stia facendo quel codice e come risolva il problema? – batmaci

+1

@batmaci Quando si aggiunge "Riferimento servizio" in Visual Studio, WCF genera codice client per chiamare il servizio. Utilizzerà DataContractSerializer per impostazione predefinita. L'aggiunta di XmlSerializerFormatAttribute fa sì che WCF generi il codice utilizzando XmlSerializer. Prova ad aggiungere un riferimento al servizio una volta con XmlSerializerFormatAttribute e una volta senza e confronta le differenze nel file di codice generato (Reference.cs). – tgriffin

+0

Non posso credere che questa risposta sia stata qui per 2 anni. Ho cercato follemente attraverso SO e il web per questa risposta. Questa è letteralmente una risposta alla mia preghiera. Nel caso in cui sia di qualche utilità per te persone del futuro che incontrano questo stesso problema, [qui] (http://stackoverflow.com/a/20713299/2453110) è il collegamento alla mia domanda simile sulla creazione di un listener di eventi DocuSign per il loro servizio di notifica Connect. –

0

ho avuto anche questo problema, ma dal client ero ancora ottenendo Field al termine dei membri della classe, anche dopo la modifica citata a livello di interfaccia.

Il problema è stato, mi stava usando un DataContractSerializer di lavorare con le richieste serializzati file del disco (durante la prova del nostro servizio, siamo stati ricevendo richieste serializzati dal provider, per essere in grado di eseguire il debug prima di andare in diretta).

Dopo aver cambiato il DataContractSerializer ad un XmlSerializer, specificando sul suo costruttore dell'elemento radice (da una chiamata typeof()) e il RootNamespace (perché per impostazione predefinita, XmlSerializers scrivere lo spazio dei nomi standard), ho potuto deserializzare le richieste e funzionare perfettamente con la Servizio WCF.

Spero che questo aiuti qualcuno. Ho perso moltissimo tempo con questo "problema".

Problemi correlati