我正在使用一个函数来检查是否存在外部 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 返回数据,但是我无法弄清楚我需要做什么才能使其工作我的代码。