.NET:检查URL的响应状态代码?

foo*_*foo 18 .net c# http

在.NET中检查Web服务器回复GET请求的状态代码的最简单方法是什么?

请注意,我不需要响应的正文.实际上,如果可能的话,只应该请求标题.然而,话虽如此,如果要求省略响应的主体会显着增加代码的复杂性,接收主体就没问题了.

此外,我特别感兴趣的是捕获所有可能的适当异常(System.Net.WebException,System.IO.IOException,System.Net.Sockets.SocketException等),因为这个例程每天会运行数千次.

Iva*_*rić 27

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;
    }
Run Code Online (Sandbox Code Playgroud)

  • 但如果URL为404,则会出错.找不到404例外 (4认同)

Joh*_*sch 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;
Run Code Online (Sandbox Code Playgroud)

RFC2616的9.4节:

HEAD方法与GET相同,只是服务器不能在响应中返回消息体.响应HEAD请求的HTTP头中包含的元信息应该与响应GET请求时发送的信息相同.该方法可用于获得关于请求所暗示的实体的元信息,而无需转移实体主体本身.此方法通常用于测试超文本链接的有效性,可访问性和最近的修改.

  • +1,很酷,我对HEAD命令一无所知。 (2认同)

Mic*_*tov 6

我最终采用了这种方法,结合了IvanFerić的答案和适当的特殊案例支持:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Kir*_*oll 3

如果您使用 HttpWebRequest,则非常简单:

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

您可以用一揽子 catch 子句包围它,或者查看 WebRequest.Create 和 .GetResponse 的文档以查看将引发哪些异常。