WebException comment obtenir une réponse complète avec un corps?

Dans WebException, je ne peux pas voir le corps de GetResponse. Ceci est mon code en C #:

try { return GetResponse(url + "." + ext.ToSsortingng(), 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; } 

Je vois en-tête mais je ne vois pas le corps. Ceci est sorti de Wireshark pour la requête:

 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."}} 

Est-il possible de voir le texte du message dans WebException? Je vous remercie.

     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; ssortingng content = client.DownloadSsortingng("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(); } 

    Cela améliore seulement les réponses existantes. J’ai écrit une méthode qui prend en charge les détails de lancer / retransmettre avec un message amélioré, qui inclut le corps de la réponse:

    Voici mon code (dans 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) { ssortingng 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; } 

    Vous l’utilisez dans une clause de capture comme le montre l’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; }