在.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)
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)
HEAD方法与GET相同,只是服务器不能在响应中返回消息体.响应HEAD请求的HTTP头中包含的元信息应该与响应GET请求时发送的信息相同.该方法可用于获得关于请求所暗示的实体的元信息,而无需转移实体主体本身.此方法通常用于测试超文本链接的有效性,可访问性和最近的修改.
我最终采用了这种方法,结合了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)
如果您使用 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 的文档以查看将引发哪些异常。