2012-04-10 120 views
31

我想使用HttpWebRequest來驗證Url的存在。我發現,這樣做基本上這幾個例子:爲什麼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; 
} 

這似乎終於做我想做的。

但我想知道,爲什麼請求會拋出一個異常,而不是返回帶有NotFound狀態碼的響應?

回答

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從.Net Framework作者的部分上的這個糟糕的設計選擇保存代碼的最少工作,但正確的解決方案是使用HttpClient,它不會拋出4xx和5xx狀態代碼。例外情況是針對特殊情況的,拋出只是爲了抓住它,並繼續進行,就好像這樣對於性能來說是醜陋和不好的,尤其是考慮到有一個更好的選項可以完全避免它。 https://msdn.microsoft.com/en-us/library/hh138242(v=vs.118).aspx – 2015-06-22 22:58:38

+1

這似乎不是真的;我在一個項目中使用HttpClient,當調用一個不存在的url並返回一個404狀態碼時,客戶端拋出一個異常而不是返回404狀態碼的響應。使用httpclient來防止這種情況有額外的步驟嗎? – SelAromDotNet 2017-04-12 17:17:15

2

爲什麼不呢?它們都是有效的設計選項,而HttpWebRequest只是設計用於這種方式。

+0

只要你可以讀取響應頭和身體時的代碼是4XX – 2012-04-10 00:59:20

+4

我想我很困惑,因爲沒有我看到這種情況的代碼示例了這方面的考慮。許多人甚至沒有嘗試/抓住,我想知道是否我錯過了一些東西,並且有辦法在不拋出異常的情況下獲得狀態。如果狀態碼被設計爲處理這種狀態,那麼拋出整個異常似乎是違反直覺的 – SelAromDotNet 2012-04-10 01:07:19

+1

是的,當你認爲「當然是xxx測試了他放在他的網站上的代碼行時,它總是會導致有趣的結果!」而你卻錯了:) – 2012-04-10 01:35:04

相關問題