HttpWebRequest.GetResponse () विफल होने पर त्रुटि की जानकारी कैसे प्राप्त करें


86

मैं एक HttpWebRequest आरंभ कर रहा हूं और फिर इसे पुनः प्राप्त कर रहा हूं। कभी-कभी, मुझे 500 (या कम से कम 5 ##) त्रुटि मिलती है, लेकिन कोई विवरण नहीं। मैं दोनों समापन बिंदुओं पर नियंत्रण रखता हूं और चाहूंगा कि प्राप्त जानकारी थोड़ी अधिक हो। उदाहरण के लिए, मैं सर्वर से क्लाइंट के लिए अपवाद संदेश पास करना चाहूंगा। क्या HttpWebRequest और HttpWebResponse का उपयोग करना संभव है?

कोड:

try
{
    HttpWebRequest webRequest = HttpWebRequest.Create(URL) as HttpWebRequest;
    webRequest.Method = WebRequestMethods.Http.Get;
    webRequest.Credentials = new NetworkCredential(Username, Password);
    webRequest.ContentType = "application/x-www-form-urlencoded";
    using(HttpWebResponse response = webRequest.GetResponse() as HttpWebResponse)
    {
        if(response.StatusCode == HttpStatusCode.OK)
        {
            // Do stuff with response.GetResponseStream();
        }
    }
}
catch(Exception ex)
{
    ShowError(ex);
    // if the server returns a 500 error than the webRequest.GetResponse() method
    // throws an exception and all I get is "The remote server returned an error: (500)."
}

इस के साथ किसी भी मदद की बहुत सराहना की जाएगी।

जवाबों:


151

क्या HttpWebRequest और HttpWebResponse का उपयोग करना संभव है?

आप अपने वेब सर्वर को बस पकड़ सकते हैं और प्रतिक्रिया के शरीर में अपवाद पाठ लिख सकते हैं, फिर 500 पर स्थिति कोड सेट कर सकते हैं। अब ग्राहक एक अपवाद फेंक देगा जब यह 500 त्रुटि का सामना करेगा लेकिन आप प्रतिक्रिया स्ट्रीम पढ़ सकते हैं और प्राप्त कर सकते हैं अपवाद का संदेश।

तो आप एक WebException को पकड़ सकते हैं जो कि एक गैर 200 स्टेटस कोड सर्वर से वापस आने और उसके शरीर को पढ़ने के लिए फेंक दिया जाएगा:

catch (WebException ex)
{
    using (var stream = ex.Response.GetResponseStream())
    using (var reader = new StreamReader(stream))
    {
        Console.WriteLine(reader.ReadToEnd());
    }
}
catch (Exception ex)
{
    // Something more serious happened
    // like for example you don't have network access
    // we cannot talk about a server exception here as
    // the server probably was never reached
}

धन्यवाद! यह ध्यान रखना महत्वपूर्ण है कि उपयोग कथन के अंदर की धारा, उपयोग कथन के बाहर उपलब्ध नहीं होगी, क्योंकि WebResponse का डिस्पोजर इसे साफ कर देगा। इसने मुझे कुछ मिनटों के लिए उलझा दिया।
थोरिन

@Thorin। पहले बयान से "धारा" अगले बयान पर ले जाया जाता है। जैसे एकल पंक्ति IF स्टेटमेंट, उदाहरण के लिए यदि (कुछ) do-stuff-here;
RealityDysfunction

1
GetRequestStreamऔर अपवादGetResponse फेंक सकते हैं ?
प्रेगनटनकोंजेरो कैब्रोन

@ प्रेगनटनकोंजेरो कैब्रोन ये, यह बिल्कुल सही नहीं लगता है, यह करता है। शुक्र है कि Microsoft ने HttpClient-क्लास की शुरुआत की, जो मुझे संदेह है कि इन दिनों सबसे अधिक उपयोग कर रहे हैं। msdn.microsoft.com/en-us/library/…
मोर्टन नोरगार्ड

8

मैं इस सवाल पर आया था जब एक एफ़टीपी साइट पर एक फ़ाइल मौजूद है या नहीं, यह जांचने की कोशिश कर रहा है। यदि फ़ाइल मौजूद नहीं है, तो टाइमस्टैम्प की जाँच करने की कोशिश करते समय कोई त्रुटि होगी। लेकिन मैं यह सुनिश्चित करना चाहता हूं कि त्रुटि कुछ और नहीं है, इसके प्रकार की जांच करके।

Responseपर संपत्ति WebExceptionप्रकार का हो जाएगा FtpWebResponse, जिस पर आप अपनी जाँच कर सकते हैं StatusCodeसंपत्ति को देखने के लिए जो एफ़टीपी त्रुटि तुम हो।

यहाँ कोड मेरे साथ समाप्त हुआ:

    public static bool FileExists(string host, string username, string password, string filename)
    {
        // create FTP request
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + host + "/" + filename);
        request.Credentials = new NetworkCredential(username, password);

        // we want to get date stamp - to see if the file exists
        request.Method = WebRequestMethods.Ftp.GetDateTimestamp;

        try
        {
            FtpWebResponse response = (FtpWebResponse)request.GetResponse();
            var lastModified = response.LastModified;

            // if we get the last modified date then the file exists
            return true;
        }
        catch (WebException ex)
        {
            var ftpResponse = (FtpWebResponse)ex.Response;

            // if the status code is 'file unavailable' then the file doesn't exist
            // may be different depending upon FTP server software
            if (ftpResponse.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
            {
                return false;
            }

            // some other error - like maybe internet is down
            throw;
        }
    }

4

मैंने एक समान स्थिति का सामना किया:

मैं बेसिकएचटीपीबाइंडिंग का उपयोग करते हुए एक एसओएपी सेवा का उपयोग करने वाली HTTP त्रुटि के मामले में कच्ची प्रतिक्रिया पढ़ने की कोशिश कर रहा था।

हालाँकि, प्रतिक्रिया का उपयोग करते समय GetResponseStream(), त्रुटि मिली:

स्ट्रीम पठनीय नहीं है

इसलिए, इस कोड ने मेरे लिए काम किया:

try
{
    response = basicHTTPBindingClient.CallOperation(request);
}
catch (ProtocolException exception)
{
    var webException = exception.InnerException as WebException;
    var rawResponse = string.Empty;

    var alreadyClosedStream = webException.Response.GetResponseStream() as MemoryStream;
    using (var brandNewStream = new MemoryStream(alreadyClosedStream.ToArray()))
    using (var reader = new StreamReader(brandNewStream))
        rawResponse = reader.ReadToEnd();
}

0

आप इस लाइब्रेरी का उपयोग भी कर सकते हैं जो HttpWebRequest और Response को सरल तरीकों से लपेटता है जो परिणामों के आधार पर वस्तुओं को लौटाता है। यह इन उत्तरों में वर्णित कुछ तकनीकों का उपयोग करता है और इसमें और इसी तरह के थ्रेड्स के उत्तरों से प्रेरित बहुत सारे कोड हैं। यह स्वचालित रूप से किसी भी अपवाद को पकड़ता है, इन वेब अनुरोधों को यथासंभव बनाने के लिए आवश्यक बायलर प्लेट कोड को अमूर्त करने की कोशिश करता है, और स्वचालित रूप से प्रतिक्रिया वस्तु को निष्क्रिय कर देता है।

इस रैपर का उपयोग करके आपका कोड कैसा दिखेगा, इसका एक उदाहरण उतना ही सरल है

    var response = httpClient.Get<SomeResponseObject>(request);
    
    if(response.StatusCode == HttpStatusCode.OK)
    {
        //do something with the response
        console.Writeline(response.Body.Id); //where the body param matches the object you pass in as an anonymous type.  
    }else {
         //do something with the error
         console.Writelint(string.Format("{0}: {1}", response.StatusCode.ToString(), response.ErrorMessage);

    }

पूर्ण प्रकटीकरण यह पुस्तकालय एक मुक्त खुला स्रोत आवरण पुस्तकालय है, और मैं उक्त पुस्तकालय का लेखक हूं। मैं इसका कोई पैसा नहीं लगाता, लेकिन पिछले कुछ वर्षों में यह बहुत उपयोगी पाया गया है और मुझे यकीन है कि कोई भी जो अभी भी HttpWebRequest / HttpWebResponse वर्गों का उपयोग करेगा।

यह एक चांदी की गोली नहीं है, लेकिन प्राप्त करने और पोस्ट करने के लिए async और गैर- async दोनों के साथ-साथ JSON या XML अनुरोधों और प्रतिक्रियाओं का समर्थन करता है। इसे सक्रिय रूप से 6/21/2020 के रूप में बनाए रखा जा रहा है


-3
HttpWebRequest myHttprequest = null;
HttpWebResponse myHttpresponse = null;
myHttpRequest = (HttpWebRequest)WebRequest.Create(URL);
myHttpRequest.Method = "POST";
myHttpRequest.ContentType = "application/x-www-form-urlencoded";
myHttpRequest.ContentLength = urinfo.Length;
StreamWriter writer = new StreamWriter(myHttprequest.GetRequestStream());
writer.Write(urinfo);
writer.Close();
myHttpresponse = (HttpWebResponse)myHttpRequest.GetResponse();
if (myHttpresponse.StatusCode == HttpStatusCode.OK)
 {
   //Perform necessary action based on response
 }
myHttpresponse.Close(); 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.