0

我正在使用一个函数来检查是否存在外部 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%。

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

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

或者,可以购买代码以更有效地执行此操作。

更新 - 12 年 11 月 14 日 --------------------------------------------- -------------------------

在听取了之前回复者的建议后,我现在遇到了一个返回 Service Unavailable (503) 的域的情况。我的例子是 www.marksandspencer.com。

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

4

1 回答 1

0

我终于到了 bieng 能够无一例外地验证所有网址的地步。

首先,我接受了戴维奥斯的建议。某些域在 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";
于 2012-11-16T10:53:15.573 回答