有没有更快的方法来检查外部网页是否存在?

我写了这个方法来检查页面是否存在:

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秒。 有没有更快或更有效的方法来做到这一点?

我认为您的方法相当不错,但会将其更改为仅通过添加w.Method = WebRequestMethods.Http.Head;下载标题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; 

您可能还想检查其他状态代码。

 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文件)可能无法从头部请求返回任何内容。 我知道,因为我现在正在解决这个问题。
编辑 – 我知道有更好的方法来检查返回数据而不是计算标题,但这是对我们很重要的东西的复制/粘贴。

一个显而易见的加速是并行运行多个请求 – 大部分时间将花费在IO上,因此每次检查一个页面产生10个线程将完成整个迭代大约10倍的速度。

  1. 您可以使用异步方式执行此操作,因为现在您在每个请求之后等待结果。 对于少数页面,您可以在ThreadPool中抛出函数,并等待所有请求完成。 对于更多请求,您可以为ResponseStream()(BeginRead等)使用异步方法。
  2. 另一件可以帮助你(确切地帮助我)的是清除.Proxy属性:
 w.Proxy = null; 

没有这个,至少第一个请求要慢得多,至少在我的机器上。
3.您无法下载整个页面,只能通过将.Method设置为“HEAD”来下载标题。

我只是使用上面的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; }