2016-03-10 18 views
10

Supponiamo Ho un webservice che restituisce una classe su tutti i metodi, informando il cliente lo stato del processo, ad esempio:Webservice metodo cambiamento risposta senza aver notificato i client

public class WsResult { 

    string result; // either "error" or "ok" 

} 

Ora vorremmo aggiungere una proprietà per questa classe, senza costringere tutti i clienti che consumano il nostro servizio ad aggiornare il loro software. È possibile?

Ad esempio:

public class WsResult { 

    public string result; // either "error" or "ok" 

    public Guid? someIdentifier; 

} 

Sto cercando risposte su entrambi i WCF e ASMX.

+0

È questo wcf o asmx? –

+0

@ TomRedfern Vorrei una risposta per entrambi, modificherò la domanda. – MeanGreen

risposta

5

WCF

è possibile. Puoi semplicemente aggiungere una nuova proprietà e funzionerà purché questa nuova proprietà non sia richiesta. Per maggiori dettagli vedere il punto 8 dell'articolo Best Practices: Data Contract Versioning.

Se è necessario gestire lo scenario di sgancio rotondo, è necessario leggere l'interfaccia IExtensibleDataObject. Il round-trip si verifica quando i dati vengono inviati da un server a un client e si prevede che verrà restituito. Vedere l'articolo Forward-Compatible Data Contracts per i dettagli.

ASMX

Con ASMX una situazione è la stessa. È possibile aggiungere una nuova proprietà e tutti i client dovrebbero funzionare. In questo caso è anche possibile utilizzare l'interfaccia IExtensibleDataObject.

commenti finali

Questa risposta si basa su test empirici con VS 2015 vi consiglio caldamente di fare lo stesso vale a dire .: scrive semplici server WCF/ASMX e clienti e verificare il comportamento descritto da me. Mi ci sono voluti solo alcuni minuti per farlo. O ancora meglio puoi utilizzare i servizi già esistenti.

Si consigliano test aggiuntivi poiché è possibile che si stia utilizzando una configurazione non predefinita che modifica il comportamento predefinito dei servizi WCF/ASMX, pertanto è consigliabile controllarlo. Non sono a conoscenza di questo tipo di configurazione ma non si sa mai.

-1

Con WCF è possibile avere diverse classi sul lato client e server, che è ciò che normalmente si verifica anche quando si utilizza l'interfaccia utente . Il trucco per farlo funzionare è impostare lo spazio dei nomi e il nome sull'attributo DataContract (e forse anche il nome sull'attributo DataMember se i nomi dei membri differiscono).

Solo le proprietà corrispondenti verranno deserializzate, in quanto l'aggiunta di una proprietà sul lato server non influirà sul lato client.

Problemi correlati