Domanda

Sto cercando di scrivere un servizio Web su specifica e richiede un corpo di risposta diverso a seconda che il metodo venga completato correttamente o meno. Ho provato a creare due diverse classi DataContract, ma come posso restituirle e serializzarle correttamente?

È stato utile?

Soluzione

La risposta è ma è difficile e perdi la digitazione forte sulla tua interfaccia. Se restituisci un Stream , i dati potrebbero essere xml, testo o persino un'immagine binaria. Per le classi DataContract, si dovrebbero quindi serializzare i dati utilizzando DataContractSerializer .

Vedi BlogSvc e più specificamente RestAtomPubService.cs servizio WCF per maggiori dettagli. Nota che quel codice sorgente ti mostrerà anche come accettare diversi tipi di dati in un metodo di riposo WCF che richiede un mappatore del tipo di contenuto.

Altri suggerimenti

Il modo migliore per indicare che il tuo servizio Web WCF è fallito sarebbe lanciare una FaultException. Esistono impostazioni nei file web.config del servizio che consentono di trasmettere l'intero messaggio di errore al client come parte dell'errore.

Un altro approccio potrebbe essere quello di ereditare entrambi i risultati dalla stessa classe o interfaccia di base. Il servizio restituirà un'istanza del tipo base. È quindi possibile utilizzare l'attributo KnownType per informare il client che possono essere restituiti più tipi. Pensaci, potrebbe essere possibile usare Object come tipo base, ma non l'ho provato.

In mancanza di uno di questi approcci, è possibile creare un oggetto risultato personalizzato che contenga sia un risultato sia le proprietà dell'errore e il client può quindi decidere quale azione intraprendere. Ho dovuto usare questo approccio per Silverlight 2 perché Beta 2 non supporta ancora completamente i contratti di errore. Non è carino, normalmente non lo consiglierei, ma se è l'unico modo che funziona o ritieni che sia l'approccio migliore per la tua situazione ...

Se riscontri problemi con ADO.NET Data Services, ho meno esperienza lì.

Ecco alcune informazioni sull'attuazione di FaultContracts

Se si utilizza un'associazione basata su XML, credo che non ci sia modo di farlo. Una soluzione semplice in quel caso dovrebbe avere solo una parte del flag di messaggio in caso di errore e, se necessario, memorizzare le informazioni sull'errore da qualche parte. Per un'associazione JSON potresti essere in grado di utilizzare un metodo che restituisce un oggetto, quindi restituisce due diversi tipi di oggetti. Se ricordo correttamente (cosa rara), ciò è possibile perché la classe JavaScriptSerializer usa la riflessione se l'oggetto è privo di attributi di serializzazione.

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