使用httpwebrequest检查url是否存在

时间:2012-11-09 14:11:43

标签: c# .net httpwebrequest

我正在使用一个函数来检查是否存在外部URL。以下是为清晰起见删除状态消息的代码。

    public static bool VerifyUrl(string url)
    {
        url.ThrowNullOrEmpty("url");

        if (!(url.StartsWith("http://") || url.StartsWith("https://")))
            return false;

        var uri = new Uri(url);

        var webRequest = HttpWebRequest.Create(uri);
        webRequest.Timeout = 5000;
        webRequest.Method = "HEAD";

        HttpWebResponse webResponse;
        try
        {
            webResponse = (HttpWebResponse)webRequest.GetResponse();
            webResponse.Close();
        }
        catch (WebException)
        {
            return false;
        }

        if (string.Compare(uri.Host, webResponse.ResponseUri.Host, true) != 0)
        {
            string responseUri = webResponse.ResponseUri.ToString().ToLower();

            if (responseUri.IndexOf("error") > -1 || responseUri.IndexOf("404.") > -1 || responseUri.IndexOf("500.") > -1)
                return false;
        }

        return true;
    }

我对一些外部网址进行了测试,结果发现大约20个中有20个作为错误返回。如果我添加用户代理,则错误大约为14%。

返回的错误是“禁止的”,尽管使用用户代理,“服务不可用”,“不允许的方法”,“未实施”或“连接已关闭”可以解决6%的错误。

我可以对我的代码做些什么来确保更多,最好是对他们的存在做出有效回应?

另外,可以购买的代码可以更有效地执行此操作。

更新 - 11月14日星期三------------------------------------------ ----------------------------

根据之前回应者的建议,我现在处于一个单一域名,返回服务不可用(503)。我的例子是www.marksandspencer.com。

当我使用此httpsniffer web-sniffer.net而不是此线程中推荐的那个时,它可以工作,使用webrequest.GET返回数据,但是我无法弄清楚我需要做什么,制作它适用于我的代码。

1 个答案:

答案 0 :(得分:0)

我终于明白了bieng能够毫无例外地验证所有网址。

首先,我接受了Davios的建议。有些域在Request.HEAD上返回错误,因此我已经包含了针对特定方案的重试。这为第二个请求创建了一个新的Request.GET。

其次,亚马逊情景。亚马逊间歇性地为自己的网站返回503错误,并为亚马逊框架上托管的网站留下永久503错误。

经过一番挖掘后,我发现将以下行添加到请求已解决。它是Firefox使用的Accept字符串。

var request = (HttpWebRequest)HttpWebRequest.Create(uri);
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";