2015-09-14 6 views
42

के मैं निम्नलिखित चर मान लीजिए दो:जांचना कि HttpStatusCode का प्रतिनिधित्व करता है सफलता या विफलता

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); 
+0

आप 'पूर्णांक कोड क्या करने की जरूरत = (int) Response.StatusCode' वहाँ से आप अपने खुद के बनाने के लिए' Enum' यहाँ http://stackoverflow.com/questions/1330856/ उदाहरण काम करने के लिए जाँच की आवश्यकता होगी हो रही-http-status-code-number-200-301-404-etc-http -brewequest-and-ht – MethodMan

+0

क्या आप 'HttpClient' कक्षा का उपयोग कर किसी भी मौके से हैं? – dcastro

+0

@dcastro नहीं, मुझे खेद है। मैं एक * उच्च स्तरीय * एपीआई का उपयोग कर रहा हूं जो आंतरिक रूप से इसका उपयोग कर सकता है (या नहीं)। एपीआई प्रतिक्रिया के स्टेटस कोड का खुलासा करता है, लेकिन उदाहरण के लिए आंतरिक 'HttpResponseMessage' का खुलासा नहीं करता है उदाहरण के लिए –

उत्तर

83

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

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

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

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

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

मामले में आप उत्सुक हैं, इस संपत्ति के रूप में implemented है।

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

3

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

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

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

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

6

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

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

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

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

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

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

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

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

+0

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

+0

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

0

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

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); 
} 
संबंधित मुद्दे