HttpWebRequest और HttpWebResponse से Http स्थिति कोड संख्या (200, 301, 404, आदि) प्राप्त करना


289

मैं कोशिश कर रहा हूँ कि HttpWebResponseवस्तु स्थिति से HTTP स्थिति कोड संख्या वापस आ जाए HttpWebRequest। मैं पाठ विवरण के बजाय वास्तविक संख्या (200, 301,302, 404, आदि) प्राप्त करने की उम्मीद कर रहा था। ("ठीक है", "MovedPermanently", आदि) क्या प्रतिक्रिया ऑब्जेक्ट में कहीं संपत्ति में दफन है? एक बड़ा स्विच फ़ंक्शन बनाने के अलावा कोई विचार? धन्यवाद।

HttpWebRequest webRequest = (HttpWebRequest)WebRequest
                                           .Create("http://www.gooogle.com/");
webRequest.AllowAutoRedirect = false;
HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
//Returns "MovedPermanently", not 301 which is what I want.
Console.Write(response.StatusCode.ToString());

विपरीत कार्रवाई के लिए: httpResponse.HTTPStatusCode = (HttpStatusCode) Enum.ToObject (typeof (HttpStatusCode), 404))
Leandro

जवाबों:


402
Console.Write((int)response.StatusCode);

HttpStatusCode (प्रकार response.StatusCode) एक गणना है जहां सदस्यों के मान HTTP स्थिति कोड से मेल खाते हैं।

public enum HttpStatusCode
{
    ...
    Moved = 301,
    OK = 200,
    Redirect = 302,
    ...
}

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

10
@rusty: यदि कनेक्शन विफल हो गया और इस तरह अनुरोध नहीं भेजा जा सका और कोई प्रतिक्रिया नहीं मिल सकी, तो कोई http स्थिति कोड नहीं होगा।
ओलिवर

3
HTTP सबटैटस मूल्य कैसे प्राप्त करें ? उदाहरण के लिए, 404.13 सामग्री की लंबाई बहुत बड़े संदर्भ: iis.net/configreference/system.webserver/security/…
Kiquenet

9
बोनस:bool success = ((int)response.StatusCode) >= 200 && ((int)response.StatusCode) < 300;
आलीन

12
@Alain डबल बोनस; बूल सक्सेस = response.IsSuccessStatusCode;
htxryan

244

आपको सावधान रहना होगा, 4xx और 5xx की सीमा में सर्वर प्रतिक्रियाएं एक WebException फेंकती हैं। आपको इसे पकड़ने की आवश्यकता है, और फिर एक WebException ऑब्जेक्ट से स्थिति कोड प्राप्त करें:

try
{
    wResp = (HttpWebResponse)wReq.GetResponse();
    wRespStatusCode = wResp.StatusCode;
}
catch (WebException we)
{
    wRespStatusCode = ((HttpWebResponse)we.Response).StatusCode;
}

मुझे खुशी है कि आपने 4xx और 5xx का उल्लेख किया है क्योंकि मैं एक कार्यक्रम के साथ मुद्दों को ठीक से काम नहीं कर रहा था। हालांकि मुझे यह इंगित करना चाहिए कि वर्तमान .NET फ्रेमवर्क आपको किसी भी अनिर्दिष्ट अपवादों के बारे में सूचित करेगा, इसलिए यह एक नो-ब्रेनर भी है।
जोएल ट्रैगर सेप

एक बोनस के रूप में, एक [DebuggerNonUserCode] के साथ एक विधि को सजाने में सक्षम हुआ करता था और जब कोई अपवाद फेंक दिया जाता है, तो डीबगर उस पद्धति में नहीं रुकता। इस तरीके से खराब डिज़ाइन किए गए अपवादों को लपेटा और अनदेखा किया जा सकता है। लेकिन अब एक रजिस्ट्री सेटिंग की आवश्यकता है
क्रुकसेक

21

'Dtb' के अनुसार आपको HttpStatusCode का उपयोग करने की आवश्यकता है, लेकिन 'zeldi' के बाद आपको कोड प्रतिक्रियाओं> = 400 के साथ अतिरिक्त सावधानी बरतने की आवश्यकता है।

यह मेरे लिए काम किया है:

HttpWebResponse response = null;
HttpStatusCode statusCode;
try
{
    response = (HttpWebResponse)request.GetResponse();
}
catch (WebException we)
{
    response = (HttpWebResponse)we.Response;
}

statusCode = response.StatusCode;
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
sResponse = reader.ReadToEnd();
Console.WriteLine(sResponse);
Console.WriteLine("Response Code: " + (int)statusCode + " - " + statusCode.ToString());

HttpWebResponse इतना खराब हो सकता है जिससे निपटने के लिए IDis प्रयोज्य लागू करता है। आप इसके बजाय निम्नलिखित का उपयोग कर सकते हैं जो आपको एक उपयोग ब्लॉक के अंदर "प्रतिक्रिया" घोषित करने की अनुमति देता है: सार्वजनिक HttpWebResponse GetSafeResponse (HttpWebRequest अनुरोध) {try {return (HttpWebResponse) अनुरोध .GetResponse (); } पकड़ (WebException we) {वापसी (HttpWebResponse) हम। }}
डेजर्टफोक्साज

11

बस के लिए मजबूर StatusCodeहै int

var statusNumber;
try {
   response = (HttpWebResponse)request.GetResponse();
   // This will have statii from 200 to 30x
   statusNumber = (int)response.StatusCode;
}
catch (WebException we) {
    // Statii 400 to 50x will be here
    statusNumber = (int)we.Response.StatusCode;
}

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