Domanda

Ho un servizio REST consumata da un client .NET WCF.

Quando viene rilevato un errore al servizio REST restituisce un HTTP 400 Bad Request con il corpo di risposta contenente i dettagli JSON serializzati.

Se eseguo la richiesta utilizzando Fiddler, Javascript o direttamente da C # posso facilmente accedere al corpo di risposta in caso di errore.

Comunque, io sto usando un ChannelFactory WCF con 6 interfacce piuttosto complessi. L'eccezione generata da questo proxy è sempre un ProtocolException, senza dettagli utili.

C'è un modo per ottenere il corpo risposta quando ottengo questo errore?


Aggiorna

Mi rendo conto che ci sono un carico di diversi modi per farlo utilizzando .Net e che ci sono altri modi per ottenere la risposta di errore. Sono utili per conoscere, ma non rispondono a questa domanda.

I servizi REST che stiamo usando cambierà e quando lo fanno le interfacce complesse vengono aggiornati. Utilizzando il ChannelFactory con le nuove interfacce significa che avremo tempo di compilazione (anziché Run Time) eccezioni e rendere queste molto più facile da mantenere e aggiornare il codice.

C'è un modo per ottenere il corpo di risposta per uno stato di errore HTTP quando si utilizzano i canali WCF?

È stato utile?

Soluzione

Non utilizzare ChannelFactory :-) Seriamente, però. Perché si creare un'interfaccia REST e quindi utilizzare il proxy client WCF. Qual è il vantaggio di utilizzare il servizio REST? Perché non usare wsHttpBinding? Con la classe HttpClient dal starter kit REST è possibile effettuare richieste HTTP standard e quindi deserializzare la risposta utilizzando il DataContractSerializer.

per es.

var httpClient = new HttpClient();
var content = httpClient.Get("http://example.org/customer/45").Content;
var customer = content.ReadAsDataContract<Customer>()

Altri suggerimenti

è possibile recuperare dettaglio eccezione, come di seguito:

                Exception innerException = exception.InnerException;
                WebException webException = innerException as WebException;
                HttpWebResponse response = webException.Response as HttpWebResponse;
                string statusDescription = response.StatusDescription;
                HttpStatusCode statusCode = response.StatusCode;

Il InnerException del ProtocolException sarà un WebException. È possibile ottenere il HttpWebResponse da quello e chiamare GetResponseStream di leggere il corpo risposta effettiva. (Ricordati di cercare l'inizio del flusso, prima lettura).

var webException = (WebException) protocolException.InnerException;
var response = (HttpWebResponse) webException.Response;
var responseStream = response.GetResponseStream()
responseStream.Seek(0, SeekOrigin.Begin);
var reader = new StreamReader(responseStream);
var responseContent = reader.ReadToEnd();

Si potrebbe provare a gettare un WebProtocolException dal servizio. In questo modo i dettagli di errore dovrebbe essere incluso nel corpo della risposta HTTP. Date un'occhiata a questo articolo:

errori Efficace Gestione con WCF e REST

I miei due centesimi è che WCF è bravo a esporre la stessa classe utilizzando molti attacchi diversi. Quando si comunica con C #, utilizzare un sapone vincolante che è bravo a informazioni sulle eccezioni. Se è necessario utilizzare vincolante lo stile REST, è possibile utilizzare un semplice WebRequest per chiamare il servizio e utilizzare il serializzatore JSON per deserializzare i risultati. Questo vi darà anche l'accesso diretto al codice di risposta.

L'approccio descritto da user653761 funziona per me; dopo aver accesso all'oggetto HttpWebResponse posso utilizzare la classe DataContractSerializer in questo modo:

var serializer = new DataContractSerializer(typeof(MyDataContractType));
var deserialized = 
    (serializer.ReadObject(httpWebResponse.GetResponseStream()) as MyDataContractType);

// ...

Credo che questo dovrebbe funzionare per tutto ciò che WCF può serializzare se si utilizza il serializzatore destra, non prova per le prestazioni (ancora).

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