有沒有簡單的方法從System.Net.WebException
獲取HTTP狀態碼?System.Net.WebException HTTP狀態碼
回答
也許這樣的事情...
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錯誤代碼(包括簡單的網絡錯誤)以外的原因,可以啓動一個WebException
。那些沒有這樣匹配的http錯誤代碼。
你可以給我們多一點你想用代碼來完成的信息。可能有更好的方法來獲取您所需要的信息。
這隻有當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;
}
您可以嘗試使用此代碼從WebException獲取HTTP狀態代碼。它也適用於Silverlight,因爲SL沒有定義WebExceptionStatus.ProtocolError。
HttpStatusCode GetHttpStatusCode(WebException we)
{
if (we.Response is HttpWebResponse)
{
HttpWebResponse response = (HttpWebResponse)we.Response;
return response.StatusCode;
}
return 0;
}
通過使用null-conditional operator(?.
),您可以用一行代碼得到HTTP狀態代碼:
HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;
變量status
將包含HttpStatusCode
。當存在更常見的故障,例如網絡錯誤,其中沒有發送HTTP狀態代碼時status
將爲空。在這種情況下,您可以檢查ex.Status
以獲得WebExceptionStatus
。
如果你只是想要一個描述字符串登錄失敗的情況下,你可以使用null-coalescing operator(??
),以獲得相關的錯誤:
string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString()
?? ex.Status.ToString();
如果異常被拋出的404的結果HTTP狀態代碼字符串將包含「NotFound」。另一方面,如果服務器處於脫機狀態,則字符串將包含「ConnectFailure」等。
(而對於想知道如何獲得HTTP狀態代碼任何人。這是不可能的。這是一個微軟IIS的概念,只記錄在服務器上,並不會發送到客戶端。)
不確定''.''運算符是否在預覽發佈期間最初被命名爲空傳播運算符或空條件運算符。但是Atlassian resharper在這種情況下給出了使用空傳播算子的警告。很高興知道它也被稱爲空條件運算符。 – RBT 2017-03-05 08:03:08
這個派對遲了一點,但公正的警告說null-conditional操作符是C#6.0的特性,所以需要使用支持它的編譯器。 [堆棧溢出答案與進一步的細節](https://stackoverflow.com/questions/39089426/how-to-install-the-ms-c-sharp-6-0-compiler)。 VS 2015+在默認情況下具有此功能,但如果使用任何種類的構建/部署環境而不僅僅是「他們的機器」,則可能需要考慮其他事項。 – CodeHxr 2017-12-11 21:47:37
(我確實意識到這個問題很古老,但是它在Google上名列前茅。)
您想知道響應代碼的常見情況是在異常處理中。由於C#7,您可以使用模式匹配實際上只是進入catch子句如果異常的謂詞相匹配:
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)
最後:注意如何沒有必要重新拋出的catch子句中的例外,當它不符合你的標準,因爲上述解決方案我們並未首先將條款列入。
- 1. Response.Redirect HTTP狀態碼
- 2. HTTP狀態代碼
- 3. HTTP 1xx狀態碼
- 4. http狀態碼200
- 5. HTTP狀態碼406
- 6. SimpleXMLElement - HTTP狀態碼?
- 7. System.Net.WebException:請求失敗,HTTP狀態400:錯誤請求。動態調用Web服務
- 8. 是否HTTP狀態碼事
- 9. 閱讀http狀態碼fsockopen
- 10. HTTP狀態代碼:在GCMDemo
- 11. 蟒蛇HTTP狀態代碼
- 12. 設置http狀態代碼
- 13. 角$ http和狀態碼304
- 14. Flash和HTTP狀態碼207
- 15. PUT的HTTP狀態代碼
- 16. NotFoundException的HTTP狀態碼500
- 17. 開關HTTP狀態代碼
- 18. REST的4xx http狀態碼
- 19. HTTP狀態碼200 vs 202
- 20. Python urllib2 URLError HTTP狀態碼。
- 21. HTTP狀態代碼413
- 22. 替代HTTP狀態碼401?
- 23. HTTP狀態碼webview android,WebViewClient
- 24. 502 HTTP狀態代碼
- 25. 解析HTTP狀態碼
- 26. GWT Requestfactory的HTTP狀態碼
- 27. 檢測HTTP狀態代碼
- 28. 獲取HTTP狀態代碼
- 29. HTTP狀態碼「0」無效
- 30. 可以重新使用416狀態碼的HTTP狀態碼嗎?
但是如果出現webexception的「connectfailure」異常,我得到的響應爲null,那麼我該如何獲取httpstatus代碼 – Rusty 2014-03-20 10:32:23
@rusty:你不行。如果連接失敗,那麼就不會有HTTP狀態碼。 – LukeH 2014-03-20 11:03:38
如果錯誤是ProtocolError,則不必檢查空響應。請參閱此[MSDN頁面]示例中的註釋(http://msdn.microsoft.com/zh-cn/library/es54hw8e%28v=vs.110%29.aspx) – 2014-05-20 15:19:29