WebException शरीर के साथ पूरी प्रतिक्रिया कैसे प्राप्त करें?


109

WebException में मैं GetResponse की बॉडी नहीं देख सकता। यह 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;
    }

मुझे हेडर दिखाई दे रहा है लेकिन मुझे शरीर दिखाई नहीं दे रहा है। यह अनुरोध के लिए Wireshark से आउटपुट है:

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

क्या यह किसी भी तरह से संदेश को देखने के लिए संभव है WebException में? धन्यवाद।


क्या आपने (HttpWebResponse) हम कोशिश की है। Where हम ’आपका पकड़ा हुआ वेब अपवाद कहां है?
जस्टिन हार्वे

2
रेथ्रोएन अपवाद में स्टैक ट्रेस को संरक्षित करने के लिए उपयोग नहीं करते हैं throw ex;लेकिन बस throw;(डिफ़ॉल्ट मामले में)। इसके अतिरिक्त (यदि आवश्यक हो) मैं मूल WebException को आपके कस्टम अपवाद Inner InnerException (उपयुक्त निर्माणकर्ता के माध्यम से) में रखूंगा।
user1713059

जवाबों:


202
var resp = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();

dynamic obj = JsonConvert.DeserializeObject(resp);
var messageFromServer = obj.error.message;

8
JsonConvert से अपरिचित किसी के लिए, आपको नूगट पैकेज प्रबंधक से Newtonsoft.Json प्राप्त करने की आवश्यकता है।
काइल

Newtonsoft.Json विकल्प के बाद से काइल की व्याख्या के साथ जवाब अद्यतन करें।
Jeroen

3
यह भी बताएं कि यह कोड ट्राइ-कैच कोडब्लॉक के कैच फॉलबैक क्लॉज के भीतर जाना चाहिए जिसमें अनुरोध जाना चाहिए। मुझे पता है कि इस मामले के लिए यह ध्यान देने वाले पाठक और @iwtu के लिए स्पष्ट है, लेकिन पूरी तरह से व्यापक जवाब इस जवाब को पढ़ने वाले शुरुआती लोगों के लिए वास्तविक अंतर बना सकते हैं;)
Jeroen

2
StreamReader ने IDis प्रयोज्य को लागू किया है, तो क्या यह एक कथन में इसे लपेटना सबसे अच्छा अभ्यास नहीं है? StreamReader की डिस्पोज़ विधि पर एक त्वरित नज़र यह बताती है कि यह वहाँ कुछ महत्वपूर्ण सफाई करता है।
sammy34

@ sammy34 कोई चिंता नहीं है, क्योंकि इस मामले में कोई अप्रबंधित कोड / डेटा नहीं है , कचरा संग्रहकर्ता इसे आसानी से संभाल सकता है ... (लेकिन उपयोग करना हमेशा एक अच्छी आदत है)
LB

42
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();
}

5

यह केवल मौजूदा उत्तरों में सुधार करता है। मैंने एक विधि लिखी है, जो एक विस्तारित संदेश के साथ फेंकने / पुनर्विचार करने के विवरण का ध्यान रखती है, जिसमें प्रतिक्रिया निकाय शामिल है:

यहाँ मेरा कोड है (Client.cs में):

/// <summary>
///     Tries to rethrow the WebException with the data from the body included, if possible. 
///     Otherwise just rethrows the original message.
/// </summary>
/// <param name="wex">The web exception.</param>
/// <exception cref="WebException"></exception>
/// <remarks>
///     By default, on protocol errors, the body is not included in web exceptions. 
///     This solutions includes potentially relevant information for resolving the
///     issue.
/// </remarks>
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;
}

आप इसे पकड़ क्लॉज में उपयोग करते हैं जैसे ओपी ने दिखाया:

//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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.