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

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

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

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

    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-AAZ迭代),运行整个循环需要3到7秒。有没有更快或更有效的方法来做到这一点?

    5 回复  |  直到 12 年前
        1
  •  39
  •   Fredrik Mörk    17 年前

    我认为你的方法相当不错,但会通过添加 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    17 年前
    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    17 年前

        4
  •  0
  •   Marcin Deptuła    17 年前
    1. 您可以使用异步方式进行,因为现在您在每次请求后都在等待结果。对于少数页面,您可以将函数放入ThreadPool中,等待所有请求完成。对于更多请求,您可以对ResponseStream()(BeginRead等)使用异步方法。
    2. 另一件能帮助你(当然可以帮助我)的事是清理 .Proxy
    w.Proxy = null;


    3.通过设置,您不能下载整个页面,只能下载标题。方法“HEAD”。

        5
  •  -2
  •   Gil Allen    12 年前

    我只是使用了上面的Fredrik Mrk答案,但将其放在一个方法中:

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