使用httpwebrequest检查URL是否存在



我正在使用函数检查外部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;
    }

我已经在某些外部URL上进行了测试,发现100个中约有20个是错误的。如果我添加用户代理,则错误约为14%。

返回的错误是"禁止的",尽管可以使用用户代理,"不可自由","不允许","未实现"或"连接关闭"。

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

术语,可以购买以更有效地购买的代码。

更新 - 11月14日--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在遵循以前受访者的建议之后,我现在处于一个单个域而无法返回服务的情况(503)。我的示例是www.marksandspencer.com。

当我使用此httpsniffer web-sniffer.net而不是该线程中建议的web-sniffer.net时,它可以使用webrequest。它在我的代码中工作。

我终于达到了bieng的点能够验证所有URL,毫无例外。

首先,我接受了戴维斯的建议。一些域返回请求错误。这创建了一个新的请求。为第二个请求获取。

其次,亚马逊方案。亚马逊间歇性地返回了自己的网站503错误,并且在亚马逊框架上托管的网站永久错误。

挖掘后,我发现在请求中添加以下行都解决了。这是Firefox使用的接受字符串。

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

相关内容

  • 没有找到相关文章

最新更新