代码之家  ›  专栏  ›  技术社区  ›  Anders

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

  •  14
  • Anders  · 技术社区  · 15 年前

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

    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;
            }
        }
    

    我使用它来检查一组页面(从a a a a-aaaz迭代),运行整个循环需要3到7秒。有没有更快或更有效的方法?

    5 回复  |  直到 11 年前
        1
  •  39
  •   Fredrik Mörk    15 年前

    我认为你的方法相当好,但是会把它改为只下载头文件 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;
    

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

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

        3
  •  0
  •   nos    15 年前

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

        4
  •  0
  •   Marcin Deptuła    15 年前
    1. 您可以使用异步方式完成这项工作,因为现在您正在等待每个请求之后的结果。对于一些页面,您可以将函数抛出到threadpool中,然后等待所有请求完成。对于更多的请求,可以对responseStream()(beginread等)使用异步方法。
    2. 另一件能帮你的事(当然帮我)是清除 .Proxy 财产:
    w.Proxy = null;

    如果没有这个,至少第一次请求要慢得多,至少在我的机器上是这样。
    三。你不能下载整页,只能下载标题,方法设置为“head”。

        5
  •  -2
  •   Gil Allen    11 年前

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