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

时间:2009-09-04 13:45:01

标签: c# asp.net

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

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秒。有更快或更有效的方法吗?

5 个答案:

答案 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)

  1. 您可以使用异步方式执行此操作,因为现在您正在等待每个请求后的结果。对于少数页面,您可以在ThreadPool中抛出函数,并等待所有请求完成。对于更多请求,您可以为ResponseStream()(BeginRead等)使用异步方法。
  2. 可以帮助你的另一件事(帮我确定)是清除.Proxy财产:
  3. 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;
        }