2010-09-10 104 views
15

.NET中最簡單的方法是檢查Web服務器回覆GET請求的狀態碼是什麼?.NET:檢查URL的響應狀態碼?

請注意,我不需要響應的主體。實際上,如果可能的話,只應該請求標題。話雖如此,但如果要求省略回覆的主體會顯着增加代碼的複雜性,那麼接收主體就沒問題。

此外,我特別感興趣的是捕獲所有可能的適當的異常(System.Net.WebException,System.IO.IOException,System.Net.Sockets.SocketException等),因爲此例程將運行每天數千次。

+0

是您使用的庫打個電話? – roufamatic 2010-09-10 23:28:04

回答

3

如果使用HttpWebRequest的,這是很容易:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://url"); 
request.Method = "GET"; 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
HttpStatusCode status = response.StatusCode; 

可以圍繞該用毯子catch子句,或者看文​​檔的WebRequest.Create和.GetResponse看看會拋出什麼異常。

12

使用HTTP方法HEAD,這是相同的GET除了不返回體:

var request = (HttpWebRequest)WebRequest.Create("http://www.example.com"); 
request.Method = "HEAD"; 
var response = (HttpWebResponse)request.GetResponse(); 

// status code... 
response.StatusCode; 

Section 9.4 of RFC2616

的HEAD方法等同於GET 不同之處在於服務器不得在響應中返回 消息體。響應於HEAD請求 的HTTP 頭中包含的元信息應當與響應於GET請求發送的信息 相同。 此方法可用於獲取 有關實體 的元信息,該請求暗示請求沒有 傳輸實體主體本身。 此方法通常用於測試 有效性的超文本鏈接, 可訪問性和最近的 修改。

+1

+1,酷,我不知道HEAD命令。 – 2010-09-11 01:14:14

+0

超棒!我相信這個人會爲我的查詢做伎倆。 – 2013-10-21 06:46:10

24
public HttpStatusCode GetHeaders(string url) 
    { 
     HttpStatusCode result = default(HttpStatusCode); 

     var request = HttpWebRequest.Create(url); 
     request.Method = "HEAD"; 
     using (var response = request.GetResponse() as HttpWebResponse) 
     { 
      if (response != null) 
      { 
       result = response.StatusCode; 
       response.Close(); 
      } 
     } 

     return result; 
    } 
+4

但如果URL是404,則會出現錯誤。找不到404例外 – william 2012-08-31 03:04:15

+0

其實這不是錯誤。這是一個普通的HTTP響應,狀態碼的差異是404 .. – 2012-08-31 12:46:03

+0

@ Ivan:那麼,我應該爲404頁面使用try-catch嗎? – william 2012-09-11 06:32:57

6

我已經結束了用這種方法結合了伊萬Ferić答案,並適當例外的情況下支持:

public async Task<bool> IsAccessibleAsync (string url) 
{ 
    if (url == null) 
     throw new ArgumentNullException ("url"); 

    if (url.IndexOf (':') < 0) 
     url = "http://" + url.TrimStart ('/'); 

    if (!Uri.IsWellFormedUriString (url, UriKind.Absolute)) 
     return false; 

    var request = (HttpWebRequest) WebRequest.Create (url); 
    request.Method = "HEAD"; 

    try 
    { 
     using (var response = await request.GetResponseAsync() as HttpWebResponse) 
     { 
      if (response != null && response.StatusCode == HttpStatusCode.OK) 
       return true; 

      return false; 
     } 
    } 
    catch (WebException) 
    { 
     return false; 
    } 
}