我写了这个方法来检查页面是否存在:
protected bool PageExists(string url)
{
try
{
Uri u = new Uri(url);
WebRequest w = WebRequest.Create(u);
w.Method = WebRequestMethods.Http.Head;
using (StreamReader s = new StreamReader(w.GetResponse().GetResponseStream()))
{
return (s.ReadToEnd().Length >= 0);
}
}
catch
{
return false;
}
}
我用它来检查一组页面(从AAAA-AAAZ迭代),运行整个循环需要3到7秒。有更快或更有效的方法吗?
答案 0 :(得分:39)
我认为您的方法相当不错,但会在调用w.Method = WebRequestMethods.Http.Head;
之前通过添加GetResponse
将其更改为仅下载标题。
这可以做到:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.example.com");
request.Method = WebRequestMethods.Http.Head;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
bool pageExists = response.StatusCode == HttpStatusCode.OK;
您可能也想检查其他状态代码。
答案 1 :(得分:1)
static bool GetCheck(string address)
{
try
{
HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest;
request.Method = "GET";
request.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);
var response = request.GetResponse();
return (response.Headers.Count > 0);
}
catch
{
return false;
}
}
static bool HeadCheck(string address)
{
try
{
HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest;
request.Method = "HEAD";
request.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);
var response = request.GetResponse();
return (response.Headers.Count > 0);
}
catch
{
return false;
}
}
请注意,某些页面(例如WCF .svc文件)可能无法从头部请求返回任何内容。我知道因为我现在正在解决这个问题 编辑 - 我知道有更好的方法来检查返回数据而不是计算标题,但这是对我们来说很重要的东西的复制/粘贴。
答案 2 :(得分:0)
一个显而易见的加速是并行运行多个请求 - 大部分时间将花在IO上,因此每次检查一个页面产生10个线程将完成整个迭代大约10倍。
答案 3 :(得分:0)
.Proxy
财产:w.Proxy = null;
如果没有这个,至少第一个请求要慢得多,至少在我的机器上 3.您无法下载整个页面,只能通过将.Method设置为“HEAD”来下载标题。
答案 4 :(得分:-2)
我只是使用上面的FredrikMörk答案,但把它放在一个方法中:
private bool checkURL(string url)
{
bool pageExists = false;
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = WebRequestMethods.Http.Head;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
pageExists = response.StatusCode == HttpStatusCode.OK;
}
catch (Exception e)
{
//Do what ever you want when its no working...
//Response.Write( e.ToString());
}
return pageExists;
}