मुझे HttpRequestException से StatusCode कैसे मिलता है?


87

मुझे शायद यहाँ कुछ स्पष्ट याद आ रहा है।

मैं उपयोग कर रहा हूँ HttpClientजो फेंकता है HttpRequestExceptionकि शामिल StatusCodeसंदेश स्ट्रिंग में।

मैं उस तक कैसे पहुंच सकता हूं StatusCode?


संपादित करें : अधिक जानकारी के लिए, मैंने इस प्रश्न को भीड़ में लिखा।

मैं HttpClientअपने WebApi प्रोजेक्ट के भीतर एक और API एक्सेस करने के लिए उपयोग कर रहा हूं । हां, मुझे पता है कि मैं क्यों बुला रहा हूं EnsureSuccessStatusCode()। मैं नीचे 404 और 403 जैसी कुछ त्रुटियों को फैलाना चाहता हूं।

सभी मैं लगातार बदलने के लिए चाहता था HttpRequestExceptionमें HttpResponseExceptionकस्टम का उपयोग कर ExceptionFilterAttribute

दुर्भाग्य से, HttpRequestExceptionकोई अतिरिक्त जानकारी नहीं है जिसे मैं संदेश के अलावा उपयोग कर सकता हूं। मैं StatusCodeकच्चे (इंट या एनम) रूप में उजागर करने की उम्मीद कर रहा था ।

लगता है कि मैं भी कर सकता हूँ:

  1. संदेश का उपयोग स्थिति कोड (ब्लॉ) स्विच करने के लिए करें
  2. या अस्सुरसुसेस्टस्टैटसकोड का मेरा संस्करण बनाएं और अपवाद को फेंक दें जो वास्तव में प्रयोग करने योग्य है।

1
क्या आप कोड का एक टुकड़ा दिखा सकते हैं?
हेमलेट हकोब्यान

1
"स्टेटस कोड एक्सेस" से आपका क्या मतलब है?
मार्को

कोड बताएं कि आपको अपवाद कहां मिल रहा है।
भाई

5
दोस्तों क्या इस सवाल के शीर्षक के बारे में स्पष्ट नहीं है?
कुगेल

1
क्या आप इस समस्या का कोई उचित समाधान खोजने में कामयाब रहे? कृपया साझा करें
सिद्धार्थ पांडेय

जवाबों:


37

स्थिति कोड एक स्ट्रिंग के हिस्से के रूप में पारित किया गया था HttpRequestExceptionताकि आप इसे अकेले ऐसे अपवादों से पुनर्प्राप्त न कर सकें।

अपवाद की प्रतीक्षा System.Net.Httpकरने के HttpResponseMessage.StatusCodeबजाय आपको डिज़ाइन करने की आवश्यकता है।

http://msdn.microsoft.com/en-us/library/system.net.http.httpresponsemessage(v=vs.110).aspx

यदि आप अब Microsoft गाइड का अनुसरण कर रहे हैं , तो सुनिश्चित करें कि आप स्पष्ट रूप से समझते हैं कि यह आपको कॉल करने के लिए क्यों कहता है HttpResponseMessage.EnsureSucessStatusCode। यदि आप उस फ़ंक्शन को कॉल नहीं करते हैं, तो कोई अपवाद नहीं होना चाहिए।


2
मैं यहां एक क्रॉस कटिंग चिंता को संबोधित करने की कोशिश कर रहा हूं। मेरे संपादन को देखें, शायद एक बेहतर समाधान है।
कुगेल

1
क्या यह HttpClient.GetStreamAsync (url) के उपयोग के साथ फिट होता है क्योंकि मैं संदेश पाठ को हटाए बिना इस क्रिया को करने का एक तरीका नहीं देख सकता?
सीनेटर

1
@ TheSenator आपको HttpResponseMessage वापस पाने के लिए GetAsync (uri) या PostAsync (uri) को कॉल करना होगा। यदि आप कोशिश करते हैं और प्रतिक्रिया की सामग्री पर या तो इसे पढ़कर या GetStreamAsync, EnsureSuccessStatusCode जैसी सुविधा पद्धति का उपयोग करके हुड के नीचे कहा जाता है।
अयोध्या

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

1
करने से कहना ज्यादा आसान है। अपवाद को तीसरे पक्ष के कोड से फेंका जा सकता है। उदाहरण के लिए ऑटोजेनरेटेड स्वैगर क्लाइंट।
user2555515

27

इसके लायक के लिए, इस आदमी ने कुछ चतुर किया: https://social.msdn.microsoft.com/Forums/vstudio/en-US/dc9bc426-1654-4319-a7fb-383bbb68def/c-httpresponsemessage-thception-hestprequex -webexception-रिमोट नाम? मंच = csharpgeneral

उस स्थिति में जहां मुझे अपवाद स्थिति संपत्ति की आवश्यकता थी, मैं यह कर सकता हूं:

catch (HttpRequestException requestException)
{
    if (requestException.InnerException is WebException webException && webException.Status == WebExceptionStatus.NameResolutionFailure)
    {
        return true;
    }

    return false;
}

14
अप-वोट किया गया क्योंकि कभी-कभी आपके पास प्रतिक्रिया तक पहुंच नहीं होती है, जैसे कि जब आप एक पुस्तकालय का उपयोग करने के लिए मजबूर होते हैं जो कार्यक्षमता को लपेटता है और किसी भी अपवाद को फेंकता है।
केल

4
.net कोर 2.1 HttpClient में GetAsync () और GetStreamAsync () है। पहला एक प्रतिक्रिया लौटाएगा जबकि दूसरा आंतरिक रूप से EnsureSucessStatusCode को कॉल करेगा और एक HttpRequestException को फेंक देगा। मैं असंगतता को नहीं समझता हूं और यह त्रुटियों को संभालना मुश्किल बनाता है, लेकिन मैं इस समाधान की सराहना करता हूं।
स्मार्तघ

2
.NET कोर 3.1.5 रनिंग requestException.InnerExceptionशून्य है, इसलिए यह काम नहीं करेगा
Ohad Schneider

3

जैसा कि दूसरों ने उल्लेख किया है कि यह HttpRequestException से StatusCode प्राप्त करने के लिए एक अच्छा अभ्यास नहीं है, वही पहले HttpResponseMessage.StatusCode के साथ HttpResponseMessage.IsSuccessStatusCode की जाँच करने के बाद किया जा सकता है

किसी भी तरह से अगर कुछ अड़चन / आवश्यकता के कारण StatusCode पढ़ना पड़े, तो दो समाधान हो सकते हैं

  1. अपने कस्टम अपवाद के साथ HttpResponseMessage को यहां विस्तारित किया गया है
  2. HttpRequestException.ToString पर स्थित है स्थिति कोड प्राप्त करने के लिए, चूंकि संदेश एक स्थिर स्थिति है जिसे StatusCode और Repharse द्वारा निर्धारित किया गया है।

नीचे System.Net.Http.HttpResponseMessage में कोड है जहाँ SR.net_http_message_not_success_statuscode = "प्रतिक्रिया स्थिति कोड सफलता का संकेत नहीं देता है: {0} ({1})।"

public HttpResponseMessage EnsureSuccessStatusCode()
    {
        if (!this.IsSuccessStatusCode)
        {
            if (this.content != null)
            {
                this.content.Dispose();
            }
            throw new HttpRequestException(string.Format(CultureInfo.InvariantCulture, SR.net_http_message_not_success_statuscode, new object[]
            {
                (int)this.statusCode,
                this.ReasonPhrase
            }));
        }
        return this;
    }

4
एक विशिष्ट प्रारूप के साथ त्रुटि स्ट्रिंग एक कोड गंध है, तर्क उन पर कभी भी निर्भर नहीं होना चाहिए।
user1496062

1
@ user1496062 जब बाहरी सिस्टम से त्रुटियां आती हैं, तो अक्सर कोई विकल्प नहीं होता है।
इयान वारबर्टन

1

इसने मेरे लिए काम किया है

var response = ex.Response;
var property = response.GetType().GetProperty("StatusCode");
if ( property != null && (HttpStatusCode)property.GetValue(response) == HttpStatusCode.InternalServerError)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.