HttpStatusCode सफलता या विफलता का प्रतिनिधित्व करता है


93

मान लें कि मेरे पास निम्नलिखित चर हैं:

System.Net.HttpStatusCode status = System.Net.HttpStatusCode.OK;

अगर यह सफलता की स्थिति कोड या विफलता है तो मैं कैसे जांच सकता हूं?

उदाहरण के लिए, मैं निम्नलिखित कर सकता हूं:

int code = (int)status;
if(code >= 200 && code < 300) {
    //Success
}

मेरी भी कुछ प्रकार की श्वेत सूची हो सकती है:

HttpStatusCode[] successStatus = new HttpStatusCode[] {
     HttpStatusCode.OK,
     HttpStatusCode.Created,
     HttpStatusCode.Accepted,
     HttpStatusCode.NonAuthoritativeInformation,
     HttpStatusCode.NoContent,
     HttpStatusCode.ResetContent,
     HttpStatusCode.PartialContent
};
if(successStatus.Contains(status)) //LINQ
{
    //Success
}

इन विकल्पों में से कोई भी मुझे आश्वस्त नहीं करता है, और मैं एक .NET वर्ग या विधि के लिए उम्मीद कर रहा था जो मेरे लिए यह काम कर सकता है, जैसे:

bool isSuccess = HttpUtilities.IsSuccess(status);

आपको int code = (int)Response.StatusCodeवहां से काम करने की आवश्यकता है, आपको अपने स्वयं के Enumचेक को काम करने के लिए यहां बनाने की आवश्यकता होगी उदाहरण के लिए stackoverflow.com/questions/1330856/…
MethodMan

क्या आप HttpClientकक्षा का उपयोग कर रहे हैं ?
डकैरो

1
@dcastro नहीं, मुझे क्षमा करें। मैं एक उच्च-स्तरीय एपीआई का उपयोग कर रहा हूं जो आंतरिक रूप से इसका उपयोग (या नहीं) कर सकता है। एपीआई प्रतिक्रिया की स्थिति कोड को उजागर करता है, लेकिन HttpResponseMessageउदाहरण के लिए आंतरिक का पर्दाफाश नहीं करता है
मतिस सिसरो

@MatiCicero यह बहुत बुरा है: / आप हमेशा HttpResponseMessage.IsSuccessStatusCode(मेरे जवाब देखें) के कार्यान्वयन का पुन: उपयोग कर सकते हैं जो आपके पहले दृष्टिकोण के समान है, और इसे HttpStatusCodeप्रकार पर एक विस्तार विधि बनाएं ।
डकैरो

जवाबों:


173

यदि आप HttpClientकक्षा का उपयोग कर रहे हैं , तो आपको HttpResponseMessageवापस मिल जाएगा।

इस वर्ग के पास एक उपयोगी संपत्ति है, IsSuccessStatusCodeजो आपके लिए चेक करेगी।

using (var client = new HttpClient())
{
    var response = await client.PostAsync(uri, content);
    if (response.IsSuccessStatusCode)
    {
        //...
    }
}

यदि आप उत्सुक हैं, तो यह गुण इस प्रकार लागू किया जाता है:

public bool IsSuccessStatusCode
{
    get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); }
}

यदि आप सीधे उपयोग नहीं कर रहे हैं तो आप इस एल्गोरिथ्म का पुन: उपयोग कर सकते HttpClientहैं।

EnsureSuccessStatusCodeप्रतिक्रिया सफल नहीं होने की स्थिति में आप अपवाद को फेंकने के लिए भी उपयोग कर सकते हैं ।


FYI करें: मेरे लिए 'response.IsSuccessful' था।
Topher जन्म

आपका उत्तर काफी मददगार है लेकिन अब यह काम करता है: if (response.IsCompletedSuccessfully) {//}
salman

12

HttpResponseMessage क्लास में एक IsSuccessStatusCode प्रॉपर्टी है, सोर्स कोड को इस तरह से देख रहा है, जैसे usr ने पहले ही 200-299 का सुझाव दिया है, शायद सबसे अच्छा आप कर सकते हैं।

public bool IsSuccessStatusCode
{
    get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); }
}

11

स्वीकृत उत्तर मुझे थोड़ा परेशान करता है क्योंकि इसके दूसरे भाग में मैजिक नंबर हैं, (हालाँकि वे मानक में हैं)। और पहला भाग सादे पूर्णांक स्थिति कोड के लिए सामान्य नहीं है, हालांकि यह मेरे उत्तर के करीब है।

आप अपने स्टेटस कोड के साथ HttpResponseMessage को इंस्टेंट करके और सफलता के लिए जाँच कर बिल्कुल वैसा ही परिणाम प्राप्त कर सकते हैं। यदि तर्क शून्य से छोटा या 999 से अधिक है, तो यह एक तर्क अपवाद को फेंक देता है।

if (new HttpResponseMessage((HttpStatusCode)statusCode).IsSuccessStatusCode)
{
    // ...
}

यह बिल्कुल संक्षिप्त नहीं है, लेकिन आप इसे एक विस्तार बना सकते हैं।


यह मेरे लिए पूरी तरह से काम करता था क्योंकि मेरे पास केवल एक HttpStatusCode था और एक प्रतिक्रिया संदेश नहीं था। बहुत बढ़िया!
टॉड वंस

5
"स्वीकृत उत्तर मुझे थोड़ा परेशान करता है क्योंकि इसमें जादू की संख्याएँ होती हैं, (हालाँकि वे मानक में हैं)" - वे "जादू" नहीं हैं यदि वे मानकीकृत हैं, अच्छी तरह से समझे जाते हैं, और कभी भी बदलने वाले नहीं हैं। सीधे कोड का उपयोग करने में कुछ भी गलत नहीं है। यदि आपके पास IsSuccessStatusCodeबहुत अच्छा है, तो इसका उपयोग करें (जैसा कि स्वीकृत उत्तर कहता है।) अन्यथा, एक एब्स्ट्रैक्शन का उपयोग करके अपने स्वयं के cruft को न जोड़ें जब तक कि आप पूरे स्थान पर यह जांच नहीं कर रहे हों
Ed S.

1
ध्यान रखें कि HttpResponseMessageइसके गुणों में से किसी एक का उपयोग करने के लिए दो तार्किक स्थितियों की जांच करने की तुलना में अधिक समय लगता है int
मिरो जे।

10

@TomDoesCode उत्तर में जोड़ना यदि आप HttpWebResponse उपयोग कर रहे हैं, तो आप इस एक्सटेंशन विधि को जोड़ सकते हैं:

public static bool IsSuccessStatusCode(this HttpWebResponse httpWebResponse)
{
    return ((int)httpWebResponse.StatusCode >= 200) && ((int)httpWebResponse.StatusCode <= 299);
}

8

मैं विस्तार विधियों की खोज के लिए आंशिक हूं।

public static class HttpStatusCodeExtensions
{
    public static bool IsSuccessStatusCode(this HttpStatusCode statusCode)
    {
        var asInt = (int)statusCode;
        return asInt >= 200 && asInt <= 299;
    }
}

जब तक आपका नाम स्थान स्कोप है, तब तक उपयोग होगा statusCode.IsSuccessStatusCode()


2
आप शायद asInt> = 200 वहाँ चाहते हैं
जिम ओ'नील

एक्सटेंशन विधियां शांत हैं, लेकिन मैं भ्रमित हूं - क्या यह HTTPResponseMessage की IsSuccessStatusCode संपत्ति का उपयोग नहीं करता है जो HTTPClient या IHTTPClientFactory के साथ उपयोग किया जाता है? @DCastro हमें यह भी दिखाता है कि यह बिल्कुल .NET में इस तरह लागू किया गया है। 2xx रेंज में HTTP स्टेटस कोड्स के लिए मैं इस तरह की एक्सटेंशन विधि का उपयोग कब / क्यों करूंगा?
sfors का कहना है कि

4
@ शेफर्स, हाँ, लेकिन क्या होगा यदि आपके पास केवल एक HttpStatusCodeगुंजाइश है? बहुत सारे पुस्तकालय हैं जो उपयोग या सतह HttpResponseMessageनहीं करते हैं लेकिन आपको स्थिति कोड देते हैं।
बोजिंगो

3

यह इस बात पर निर्भर करता है कि आप किस HTTP रिसोर्स को कॉल कर रहे हैं। आमतौर पर, 2xxसीमा को सफलता की स्थिति कोड की सीमा के रूप में परिभाषित किया जाता है। यह स्पष्ट रूप से एक सम्मेलन है जो हर HTTP सर्वर का पालन नहीं करेगा।

उदाहरण के लिए, वेबसाइट पर एक फॉर्म सबमिट करने से अक्सर 302 रीडायरेक्ट वापस आ जाएगा।

यदि आप एक सामान्य विधि तैयार करना चाहते हैं, तो code >= 200 && code < 300विचार शायद आपका सबसे अच्छा शॉट है।

यदि आप अपने स्वयं के सर्वर को बुला रहे हैं, तो आपको संभवतः यह सुनिश्चित करना चाहिए कि आप मानकीकृत करें 200


2

यह पिछले उत्तर का एक विस्तार है, जो प्रत्येक आह्वान के लिए एक नई वस्तु के निर्माण और बाद के कचरा संग्रह से बचा जाता है।

public static class StatusCodeExtensions
{
    private static readonly ConcurrentDictionary<HttpStatusCode, bool> IsSuccessStatusCode = new ConcurrentDictionary<HttpStatusCode, bool>();
    public static bool IsSuccess(this HttpStatusCode statusCode) => IsSuccessStatusCode.GetOrAdd(statusCode, c => new HttpResponseMessage(c).IsSuccessStatusCode);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.