我正在使用一个函数来检查是否存在外部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返回数据,但是我无法弄清楚我需要做什么,制作它适用于我的代码。
答案 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";