2010-09-10 116 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; 
    } 
}