जवाबों:
शायद कुछ इस तरह ...
try
{
// ...
}
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.ProtocolError)
{
var response = ex.Response as HttpWebResponse;
if (response != null)
{
Console.WriteLine("HTTP Status Code: " + (int)response.StatusCode);
}
else
{
// no http status code available
}
}
else
{
// no http status code available
}
}
नल-सशर्त ऑपरेटर ( ?.
) का उपयोग करके आप कोड की एक पंक्ति के साथ HTTP स्थिति कोड प्राप्त कर सकते हैं:
HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;
चर status
में समाहित होगा HttpStatusCode
। जब एक नेटवर्क त्रुटि की तरह अधिक सामान्य विफलता होती है जहां कोई HTTP स्थिति कोड कभी नहीं भेजा जाता है, तो status
शून्य हो जाएगा। उस स्थिति में आप ex.Status
प्राप्त करने के लिए निरीक्षण कर सकते हैं WebExceptionStatus
।
यदि आप एक विफलता के मामले में लॉग इन करना चाहते हैं, तो आप संबंधित त्रुटि प्राप्त करने के लिए नल-कोलेसिंग ऑपरेटर ( ??
) का उपयोग कर सकते हैं :
string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString()
?? ex.Status.ToString();
यदि अपवाद 404 HTTP स्थिति कोड के परिणामस्वरूप फेंका जाता है, तो स्ट्रिंग में "NotFound" होगा। दूसरी ओर, यदि सर्वर ऑफ़लाइन है, तो स्ट्रिंग में "कनेक्टफ़ेल्योर" और इसी तरह शामिल होंगे।
(और जो कोई भी जानना चाहता है कि HTTP सबस्टैट कोड कैसे प्राप्त करें। यह संभव नहीं है। यह एक Microsoft IIS कॉन्सेप्ट है जो केवल सर्वर पर लॉग इन किया जाता है और क्लाइंट को कभी नहीं भेजा जाता है।)
?.
पूर्वावलोकन रिलीज़ के दौरान ऑपरेटर को मूल रूप से अशक्त प्रसार ऑपरेटर या अशक्त-सशर्त ऑपरेटर का नाम दिया गया था या नहीं। लेकिन एटलसियन रेस्परर ऐसे परिदृश्यों में अशक्त प्रसार संचालक का उपयोग करने की चेतावनी देता है। यह जानकर अच्छा लगा कि इसे अशक्त-संचालक भी कहा जाता है।
यह तभी काम करता है जब WebResponse एक HttpWebResponse हो।
try
{
...
}
catch (System.Net.WebException exc)
{
var webResponse = exc.Response as System.Net.HttpWebResponse;
if (webResponse != null &&
webResponse.StatusCode == System.Net.HttpStatusCode.Unauthorized)
{
MessageBox.Show("401");
}
else
throw;
}
(मुझे पता है कि सवाल पुराना है, लेकिन यह Google पर शीर्ष हिट में से एक है।)
एक सामान्य स्थिति जहां आप प्रतिक्रिया कोड जानना चाहते हैं अपवाद अपवाद में है। C # 7 के अनुसार, यदि आप अपवाद को अपनी भविष्यवाणी से मेल खाते हैं, तो आप वास्तव में केवल कैच क्लॉज में प्रवेश करने के लिए पैटर्न से मेल खा सकते हैं:
catch (WebException ex) when (ex.Response is HttpWebResponse response)
{
doSomething(response.StatusCode)
}
इसे आसानी से आगे के स्तरों तक बढ़ाया जा सकता है, जैसे कि इस मामले में जहां WebException
वास्तव में दूसरे का आंतरिक अपवाद था (और हम केवल इसमें रुचि रखते हैं 404
):
catch (StorageException ex) when (ex.InnerException is WebException wex && wex.Response is HttpWebResponse r && r.StatusCode == HttpStatusCode.NotFound)
अंत में: ध्यान दें कि कैच क्लॉज में अपवाद को फिर से फेंकने की आवश्यकता नहीं है जब यह आपके मानदंडों से मेल नहीं खाता है, क्योंकि हम उपरोक्त समाधान के साथ पहले स्थान पर क्लॉज दर्ज नहीं करते हैं।
आप WebException से HTTP स्थिति कोड प्राप्त करने के लिए इस कोड को आज़मा सकते हैं। यह सिल्वरलाइट में भी काम करता है क्योंकि SL में WebExceptionStatus.ProtocolError परिभाषित नहीं है।
HttpStatusCode GetHttpStatusCode(WebException we)
{
if (we.Response is HttpWebResponse)
{
HttpWebResponse response = (HttpWebResponse)we.Response;
return response.StatusCode;
}
return null;
}
return 0
? या बेहतर HttpStatusCode?
( अशक्त )
var code = GetHttpStatusCode(ex); if (code != HttpStatusCode.InternalServerError) {EventLog.WriteEntry( EventLog.WriteEntry("MyApp", code, System.Diagnostics.EventLogEntryType.Information, 1);}
मुझे यकीन नहीं है कि अगर वहाँ है, लेकिन अगर ऐसी कोई संपत्ति थी तो इसे विश्वसनीय नहीं माना जाएगा। एक WebException
HTTP के अलावा अन्य कारण सरल नेटवर्किंग त्रुटियों सहित त्रुटि कोड के लिए निकाल दिया जा सकता है। जिनके पास ऐसा कोई http http कोड नहीं है।
क्या आप हमें उस कोड के साथ पूरा करने के लिए कुछ और जानकारी दे सकते हैं। आपके लिए आवश्यक जानकारी प्राप्त करने का एक बेहतर तरीका हो सकता है।