我想创建一个方法来确定某个特定的URL是否可以匿名访问。我这样做是为了从自定义搜索页面中删除无法访问的结果。我能想到的最好的是
public bool IsWebAddressAccessible(string Url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
try
{
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
}
catch (System.Net.WebException)
{
return false;
}
return true;
}
然而,由于两个原因,这不太理想。首先,据我所知,以这种方式依赖逻辑异常并不高效。其次,在页面可访问的情况下,它似乎检索整个页面,这是耗时的。所以问题是:
答案 0 :(得分:2)
有关问题2的帮助,您只能执行HEAD请求。在尝试之前插入此内容
request.Method = "HEAD";
编辑:实际上请看这篇文章进行全面讨论: WebRequest "HEAD" light weight alternative
答案 1 :(得分:1)
这是HttpWebRequest设计中的vexing exception。我实际上在我的一个项目中有一些扩展方法(一个使得许多请求返回304未被修改):
[DebuggerNonUserCode]
public static HttpWebResponse GetHttpResponse(this HttpWebRequest request) {
// We know the response will be a HttpWebResponse because the request is a HttpWebRequest
return (HttpWebResponse)request.GetResponse();
}
[DebuggerNonUserCode]
public static HttpWebResponse GetHttpResponseAvoidVexingExceptions(this HttpWebRequest request) {
try {
return GetHttpResponse(request);
} catch (WebException ex) {
HttpWebResponse response = (HttpWebResponse)ex.Response;
switch (response.StatusCode) {
case HttpStatusCode.NotModified:
return response;
default:
// We don't catch other exceptions
throw;
}
}
}
我无法避免这种例外。
HEAD
方法只返回响应标头。