WebException come ottenere una risposta completa con un corpo?

In WebException non riesco a vedere il corpo di GetResponse. Questo è il mio codice in C #:

try { return GetResponse(url + "." + ext.ToString(), method, headers, bodyParams); } catch (WebException ex) { switch (ex.Status) { case WebExceptionStatus.ConnectFailure: throw new ConnectionException(); case WebExceptionStatus.Timeout: throw new RequestTimeRanOutException(); case WebExceptionStatus.NameResolutionFailure: throw new ConnectionException(); case WebExceptionStatus.ProtocolError: if (ex.Message == "The remote server returned an error: (401) unauthorized.") { throw new CredentialsOrPortalException(); } throw new ProtocolErrorExecption(); default: throw; } 

Vedo l’intestazione ma non vedo il corpo. Questo è prodotto da Wireshark per la richiesta:

 POST /api/1.0/authentication.json HTTP/1.1 Content-Type: application/x-www-form-urlencoded Accept: application/json Host: nbm21tm1.teamlab.com Content-Length: 49 Connection: Keep-Alive userName=XXX&password=YYYHTTP/1.1 500 Server error Cache-Control: private, max-age=0 Content-Length: 106 Content-Type: application/json; charset=UTF-8 Server: Microsoft-IIS/7.5 X-AspNet-Version: 2.0.50727 X-Powered-By: ASP.NET X-Powered-By: ARR/2.5 Date: Mon, 06 Aug 2012 12:49:41 GMT Connection: close {"count":0,"startIndex":0,"status":1,"statusCode":500,"error":{"message":"Invalid username or password."}} 

È ansible in qualche modo vedere il testo del messaggio in WebException? Grazie.

 var resp = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd(); dynamic obj = JsonConvert.DeserializeObject(resp); var messageFromServer = obj.error.message; 
 try { WebClient client = new WebClient(); client.Encoding = Encoding.UTF8; string content = client.DownloadString("https://sandiegodata.atlassian.net/wiki/pages/doaddcomment.action?pageId=524365"); Console.WriteLine(content); Console.ReadKey(); } catch (WebException ex) { var resp = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd(); Console.WriteLine(resp); Console.ReadKey(); } 

Questo migliora solo sulle risposte esistenti. Ho scritto un metodo che si occupa dei dettagli del lancio / rilancio con un messaggio avanzato, che include il corpo della risposta:

Ecco il mio codice (in Client.cs):

 ///  /// Tries to rethrow the WebException with the data from the body included, if possible. /// Otherwise just rethrows the original message. ///  /// The web exception. ///  ///  /// By default, on protocol errors, the body is not included in web exceptions. /// This solutions includes potentially relevant information for resolving the /// issue. ///  private void ThrowWithBody(WebException wex) { if (wex.Status == WebExceptionStatus.ProtocolError) { string responseBody; try { //Get the message body for rethrow with body included responseBody = new StreamReader(wex.Response.GetResponseStream()).ReadToEnd(); } catch (Exception) { //In case of failure to get the body just rethrow the original web exception. throw wex; } //include the body in the message throw new WebException(wex.Message + $" Response body: '{responseBody}'", wex, wex.Status, wex.Response); } //In case of non-protocol errors no body is available anyway, so just rethrow the original web exception. throw wex; } 

Lo usi in una clausola di cattura molto simile a quella mostrata dall’OP:

 //Execute Request, catch the exception to eventually get the body try { //GetResponse.... } } catch (WebException wex) { if (wex.Status == WebExceptionStatus.ProtocolError) { ThrowWithBody(wex); } //otherwise rethrow anyway throw; }