2010-08-31 186 views

回答

181

也許這樣的事情...

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 
    } 
} 
+0

但是如果出現webexception的「connectfailure」異常,我得到的響應爲null,那麼我該如何獲取httpstatus代碼 – Rusty 2014-03-20 10:32:23

+5

@rusty:你不行。如果連接失敗,那麼就不會有HTTP狀態碼。 – LukeH 2014-03-20 11:03:38

+4

如果錯誤是ProtocolError,則不必檢查空響應。請參閱此[MSDN頁面]示例中的註釋(http://msdn.microsoft.com/zh-cn/library/es54hw8e%28v=vs.110%29.aspx) – 2014-05-20 15:19:29

1

我不確定如果有,但如果有這樣的屬性,它將不被視爲可靠。由於HTTP錯誤代碼(包括簡單的網絡錯誤)以外的原因,可以啓動一個WebException。那些沒有這樣匹配的http錯誤代碼。

你可以給我們多一點你想用代碼來完成的信息。可能有更好的方法來獲取您所需要的信息。

8

這隻有當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; 
} 
+0

爲什麼只處理401-Unauthorized而不是所有可能的HTTP錯誤狀態碼?這是最差的答案 – ympostor 2017-06-27 05:39:15

+1

@ympostor這只是一個例子。任何合理的開發人員都理解這一點你的評論是我讀過的最沒心思的。 – pr0gg3r 2017-06-28 08:53:55

1

您可以嘗試使用此代碼從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; 
} 
13

通過使用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的概念,只記錄在服務器上,並不會發送到客戶端。)

+0

不確定''.''運算符是否在預覽發佈期間最初被命名爲空傳播運算符或空條件運算符。但是Atlassian resharper在這種情況下給出了使用空傳播算子的警告。很高興知道它也被稱爲空條件運算符。 – RBT 2017-03-05 08:03:08

+0

這個派對遲了一點,但公正的警告說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

1

(我確實意識到這個問題很古老,但是它在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子句中的例外,當它不符合你的標準,因爲上述解決方案我們並未首先將條款列入。