System.Net.WebException HTTP स्थिति कोड


जवाबों:


248

शायद कुछ इस तरह ...

try
{
    // ...
}
catch (WebException ex)
{
    if (ex.Status == WebExceptionStatus.ProtocolError)
    {
        var response = ex.Response as HttpWebResponse;
        if (response != null)
        {
            Console.WriteLine("HTTP Status Code: " + (int)response.StatusCode);
        }
        else
        {
            // no http status code available
        }
    }
    else
    {
        // no http status code available
    }
}

लेकिन "कनेक्टफेल्योर" के अपवाद के मामले में, मुझे अशक्त के रूप में प्रतिक्रिया मिलती है, उस स्थिति में मैं httpstatus कोड कैसे प्राप्त कर सकता हूं
जंग खाए

8
@rusty: आप नहीं कर सकते। यदि कोई कनेक्शन विफलता है, तो कोई HTTP स्थिति कोड नहीं है।
ल्यूक

4
यदि त्रुटि एक प्रोटोकॉल है, तो आपको अशक्त के लिए प्रतिक्रिया की जांच करने की आवश्यकता नहीं है। इस MSDN पृष्ठ
एंड्रास टोथ

5
@AndrasToth लेकिन यदि आप अशक्तता को रोकते हैं तो ReSharper जैसे उपकरण आपको चेतावनी देंगे। और किसी भी मामले में, रक्षात्मक रूप से कोड करने के लिए यह अच्छा अभ्यास है।
टॉम लिंट

1
HTTP सबटैटस मूल्य कैसे प्राप्त करें ? उदाहरण के लिए, 404.13 सामग्री की लंबाई बहुत बड़ा संदर्भ : docs.microsoft.com/en-us/iis/configuration/system.webServer/…
Kiquenet

27

नल-सशर्त ऑपरेटर ( ?.) का उपयोग करके आप कोड की एक पंक्ति के साथ HTTP स्थिति कोड प्राप्त कर सकते हैं:

 HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;

चर statusमें समाहित होगा HttpStatusCode। जब एक नेटवर्क त्रुटि की तरह अधिक सामान्य विफलता होती है जहां कोई HTTP स्थिति कोड कभी नहीं भेजा जाता है, तो statusशून्य हो जाएगा। उस स्थिति में आप ex.Statusप्राप्त करने के लिए निरीक्षण कर सकते हैं WebExceptionStatus

यदि आप एक विफलता के मामले में लॉग इन करना चाहते हैं, तो आप संबंधित त्रुटि प्राप्त करने के लिए नल-कोलेसिंग ऑपरेटर ( ??) का उपयोग कर सकते हैं :

string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString()
    ?? ex.Status.ToString();

यदि अपवाद 404 HTTP स्थिति कोड के परिणामस्वरूप फेंका जाता है, तो स्ट्रिंग में "NotFound" होगा। दूसरी ओर, यदि सर्वर ऑफ़लाइन है, तो स्ट्रिंग में "कनेक्टफ़ेल्योर" और इसी तरह शामिल होंगे।

(और जो कोई भी जानना चाहता है कि HTTP सबस्टैट कोड कैसे प्राप्त करें। यह संभव नहीं है। यह एक Microsoft IIS कॉन्सेप्ट है जो केवल सर्वर पर लॉग इन किया जाता है और क्लाइंट को कभी नहीं भेजा जाता है।)


यह निश्चित नहीं है कि ?.पूर्वावलोकन रिलीज़ के दौरान ऑपरेटर को मूल रूप से अशक्त प्रसार ऑपरेटर या अशक्त-सशर्त ऑपरेटर का नाम दिया गया था या नहीं। लेकिन एटलसियन रेस्परर ऐसे परिदृश्यों में अशक्त प्रसार संचालक का उपयोग करने की चेतावनी देता है। यह जानकर अच्छा लगा कि इसे अशक्त-संचालक भी कहा जाता है।
RBT

1
इस पार्टी के लिए थोड़ा देर से, लेकिन निष्पक्ष चेतावनी है कि अशक्त-संचालक एक सी # 6.0 सुविधा है, इसलिए किसी को एक संकलक का उपयोग करने की आवश्यकता है जो इसका समर्थन करता है। अधिक जानकारी के साथ ढेर अतिप्रवाह उत्तर । वीएस 2015+ में डिफ़ॉल्ट रूप से है, लेकिन अगर कोई "अपनी मशीन" के अलावा किसी भी प्रकार के बिल्ड / परिनियोजित वातावरण का उपयोग कर रहा है, तो अन्य बातों पर ध्यान देने की आवश्यकता हो सकती है।
कोडहक्र

9

यह तभी काम करता है जब WebResponse एक HttpWebResponse हो।

try
{
    ...
}
catch (System.Net.WebException exc)
{
    var webResponse = exc.Response as System.Net.HttpWebResponse;
    if (webResponse != null && 
        webResponse.StatusCode == System.Net.HttpStatusCode.Unauthorized)
    {
        MessageBox.Show("401");
    }
    else
        throw;
}

केवल सभी संभावित HTTP त्रुटि स्थिति कोड के बजाय 401-अनधिकृत के साथ सौदा क्यों करें? यह सबसे खराब उत्तर है
ympostor

4
@ympostor यह केवल एक उदाहरण है। कोई भी उचित डेवलपर इसे समझता है। आपकी टिप्पणी सबसे विचारहीन है जिसे मैंने कभी यहां पढ़ा है।
pr0gg3r

9

(मुझे पता है कि सवाल पुराना है, लेकिन यह Google पर शीर्ष हिट में से एक है।)

एक सामान्य स्थिति जहां आप प्रतिक्रिया कोड जानना चाहते हैं अपवाद अपवाद में है। C # 7 के अनुसार, यदि आप अपवाद को अपनी भविष्यवाणी से मेल खाते हैं, तो आप वास्तव में केवल कैच क्लॉज में प्रवेश करने के लिए पैटर्न से मेल खा सकते हैं:

catch (WebException ex) when (ex.Response is HttpWebResponse response)
{
     doSomething(response.StatusCode)
}

इसे आसानी से आगे के स्तरों तक बढ़ाया जा सकता है, जैसे कि इस मामले में जहां WebExceptionवास्तव में दूसरे का आंतरिक अपवाद था (और हम केवल इसमें रुचि रखते हैं 404):

catch (StorageException ex) when (ex.InnerException is WebException wex && wex.Response is HttpWebResponse r && r.StatusCode == HttpStatusCode.NotFound)

अंत में: ध्यान दें कि कैच क्लॉज में अपवाद को फिर से फेंकने की आवश्यकता नहीं है जब यह आपके मानदंडों से मेल नहीं खाता है, क्योंकि हम उपरोक्त समाधान के साथ पहले स्थान पर क्लॉज दर्ज नहीं करते हैं।


4

आप WebException से HTTP स्थिति कोड प्राप्त करने के लिए इस कोड को आज़मा सकते हैं। यह सिल्वरलाइट में भी काम करता है क्योंकि SL में WebExceptionStatus.ProtocolError परिभाषित नहीं है।

HttpStatusCode GetHttpStatusCode(WebException we)
{
    if (we.Response is HttpWebResponse)
    {
        HttpWebResponse response = (HttpWebResponse)we.Response;
        return response.StatusCode;
    }
    return null;
}

1
return 0? या बेहतर HttpStatusCode?( अशक्त )
कीकेनेट

यह काम करेगा? var code = GetHttpStatusCode(ex); if (code != HttpStatusCode.InternalServerError) {EventLog.WriteEntry( EventLog.WriteEntry("MyApp", code, System.Diagnostics.EventLogEntryType.Information, 1);}
एफएमएफएफ

मैं नहीं समझ सकता कि आप इस नमूने में क्या करना चाहते थे। आप किन मामलों में लॉग इन होना चाहते थे?
सेर्गेई

1

मुझे यकीन नहीं है कि अगर वहाँ है, लेकिन अगर ऐसी कोई संपत्ति थी तो इसे विश्वसनीय नहीं माना जाएगा। एक WebExceptionHTTP के अलावा अन्य कारण सरल नेटवर्किंग त्रुटियों सहित त्रुटि कोड के लिए निकाल दिया जा सकता है। जिनके पास ऐसा कोई http http कोड नहीं है।

क्या आप हमें उस कोड के साथ पूरा करने के लिए कुछ और जानकारी दे सकते हैं। आपके लिए आवश्यक जानकारी प्राप्त करने का एक बेहतर तरीका हो सकता है।

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