2012-04-10 11 views
31

मैं HttpWebRequest का उपयोग कर यूआरएल के अस्तित्व को सत्यापित करने की कोशिश कर रहा हूं।HttpWebRequest ने HttpStatusCode.NotFound को वापस करने के बजाय अपवाद फेंक दिया क्यों है?

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url); 
request.Method = "HEAD"; 
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
{ 
    return response.StatusCode; 
} 

हालांकि, अगर यूआरएल वास्तव में टूट गया है, यह एक प्रतिक्रिया लौटाएँ नहीं कर रहा है, तो इसकी बजाय अपवाद फेंक रहा है: मैं कुछ उदाहरण है कि मूल रूप से यह कर पाया।

try 
{ 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url); 
    request.Method = "HEAD"; 
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
    { 
     return response.StatusCode; 
    } 
} 
catch (System.Net.WebException ex) 
{ 
    var response = ex.Response as HttpWebResponse; 
    return response == null ? HttpStatusCode.InternalServerError : response.StatusCode; 
} 

जो अंत में मैं क्या चाहते हो रहा है:

मैं इस के लिए मेरे कोड को संशोधित किया।

लेकिन मुझे यह जानना है कि अनुरोध नॉटफॉउंड स्थिति कोड के साथ प्रतिक्रिया वापस करने के बजाय अपवाद फेंकने का अनुरोध क्यों है?

उत्तर

54

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

public static class HttpWebResponseExt 
{ 
    public static HttpWebResponse GetResponseNoException(this HttpWebRequest req) 
    { 
     try 
     { 
      return (HttpWebResponse)req.GetResponse(); 
     } 
     catch (WebException we) 
     { 
      var resp = we.Response as HttpWebResponse; 
      if (resp == null) 
       throw; 
      return resp; 
     } 
    } 
} 
+6

हालांकि नेट फ्रेमवर्क लेखकों के भाग पर इस खराब डिज़ाइन विकल्प से HttpWebRequest/Response का उपयोग करके कोड को सहेजने के लिए यह कम से कम काम है, सही समाधान HttpClient का उपयोग करना है, जो 4xx और 5xx स्थिति कोड पर नहीं फेंकता है। असाधारण परिस्थितियों के लिए अपवाद हैं, और इसे पकड़ने के लिए फेंकना और आगे बढ़ना जैसे कि यह ठीक है, प्रदर्शन के लिए बदसूरत और बुरा है, विशेष रूप से यह एक बेहतर विकल्प है जो इसे पूरी तरह से टालता है। https://msdn.microsoft.com/en-us/library/hh138242(v=vs.118).aspx –

+1

यह सत्य प्रतीत नहीं होता है; मैं एक प्रोजेक्ट में एचटीपी क्लाइंट का उपयोग कर रहा हूं और एक यूआरएल को कॉल करते समय जो मौजूद नहीं है जो 404 स्टेटस कोड देता है, क्लाइंट 404 स्टेटस कोड के साथ प्रतिक्रिया लौटने के बजाय अपवाद फेंक रहा है। क्या इसे रोकने के लिए httpclient का उपयोग करने में एक अतिरिक्त कदम है? – SelAromDotNet

2

क्यों नहीं? वे दोनों वैध डिज़ाइन विकल्प हैं, और HttpWebRequest को इस तरह से काम करने के लिए डिज़ाइन किया गया था।

+0

जब तक आप प्रतिक्रिया हेडर और शरीर पढ़ सकते हैं जब कोड 4xx –

+4

है मुझे लगता है मैं, भ्रमित हो गया क्योंकि कोड नमूने मैं इसके लिए देखा में से कोई भी इस बात का ध्यान ले लिया। कई लोगों ने कोशिश भी नहीं की थी, और मैं सोच रहा था कि शायद मुझे कुछ याद आया और अपवाद फेंकने के बिना स्थिति पाने का कोई तरीका है। अगर स्टेटसोड को ऐसी स्थिति को संभालने के लिए डिज़ाइन किया गया है तो यह एक संपूर्ण अपवाद फेंकने के लिए प्रतिबिंबित लगता है – SelAromDotNet

+1

हाँ, यह हमेशा दिलचस्प परिणाम देता है जब आप सोचते हैं कि "निश्चित रूप से xxx ने अपनी वेबसाइट पर दिए गए कोड की रेखा का परीक्षण किया है!" और आप गलत हो जाते हैं :) –

संबंधित मुद्दे