是否有可靠的方法来验证 URL 的存在?
Is there a surefire way to validate the existence of a URL?
我有一个 C# MVC4 网站,称之为 foo.org。其中有"pages"如foo.org/news或foo.org/events。这是一个http网站,不是https。
我有另一个 C# MVC4 网站,也是一个 http 网站,它管理第一个网站(在同一个网络服务器上)。在后一个网站中,我需要验证第一个网站中 "foo.org/news" 等页面的存在。
两者都是 Intranet 站点。
foo.org/news 和 foo.org/events 实际上是有效页面。如果我在浏览器的地址栏上输入他们的网址,他们就会出现,...没问题。
我尝试了 SO 和其他论坛的一些建议,但都无济于事。
我尝试过的事情:
HttpWebRequest request = WebRequest.Create(uri) as HttpWebRequest;
request.Method = "HEAD";
HttpWebResponse response = request.GetResponse() as HttpWebResponse);
var retval = (response.StatusCode == HttpStatusCode.OK);
response.Close();
return retval;
和
var pingSender = new Ping();
var options = new PingOptions();
options.DontFragment = true;
var data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
var buffer = Encoding.ASCII.GetBytes(data);
var timeout = 120;
var reply = pingSender.Send(uri, timeout, buffer, options);
return (reply.Status == IPStatus.Success);
和
IPHostEntry ipHost = Dns.GetHostEntry(safeHost);
return (ipHost.HostName != null && ipHost.HostName != "");
在每一个中,我都尝试了有无前置 "http://"。
现在我通过一个接一个地尝试将所有 3 个结合起来,return 我遇到的第一个成功。我可以验证 google.com 或 foo.org 等网址,但当我将“/news”附加到 foo.org.
时则不能
上面的代码与我的不完全一样,只是其中的内容。
根据它们验证 URL 的程度从最差到最好对您的选项进行排序:
- 您的第三个选项只查找 URL 的 DNS 记录。即使没有网络服务器侦听该 IP,它也会 return 为真。
- 第二个选项将对网络服务器执行 ping 操作,但您不能保证允许 ping 操作(这会产生误报)或者响应的设备是实际的网络服务器(这会产生误报)。
- 第一个选项将与网络服务器对话以验证页面,但并非所有服务器都会正确响应
HEAD
请求(在这种情况下这可能是您的问题)。这仍然会有误报和漏报,但比上面的选项要好。
- 第一个选项的变体是将 HTTP 方法更改为
GET
请求。这将向网络服务器询问实际的网页。这将给出最正确的答案,看看该网页是否存在,但总会有一些情况你得不到正确答案。
我有一个 C# MVC4 网站,称之为 foo.org。其中有"pages"如foo.org/news或foo.org/events。这是一个http网站,不是https。
我有另一个 C# MVC4 网站,也是一个 http 网站,它管理第一个网站(在同一个网络服务器上)。在后一个网站中,我需要验证第一个网站中 "foo.org/news" 等页面的存在。
两者都是 Intranet 站点。
foo.org/news 和 foo.org/events 实际上是有效页面。如果我在浏览器的地址栏上输入他们的网址,他们就会出现,...没问题。
我尝试了 SO 和其他论坛的一些建议,但都无济于事。
我尝试过的事情:
HttpWebRequest request = WebRequest.Create(uri) as HttpWebRequest;
request.Method = "HEAD";
HttpWebResponse response = request.GetResponse() as HttpWebResponse);
var retval = (response.StatusCode == HttpStatusCode.OK);
response.Close();
return retval;
和
var pingSender = new Ping();
var options = new PingOptions();
options.DontFragment = true;
var data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
var buffer = Encoding.ASCII.GetBytes(data);
var timeout = 120;
var reply = pingSender.Send(uri, timeout, buffer, options);
return (reply.Status == IPStatus.Success);
和
IPHostEntry ipHost = Dns.GetHostEntry(safeHost);
return (ipHost.HostName != null && ipHost.HostName != "");
在每一个中,我都尝试了有无前置 "http://"。
现在我通过一个接一个地尝试将所有 3 个结合起来,return 我遇到的第一个成功。我可以验证 google.com 或 foo.org 等网址,但当我将“/news”附加到 foo.org.
时则不能上面的代码与我的不完全一样,只是其中的内容。
根据它们验证 URL 的程度从最差到最好对您的选项进行排序:
- 您的第三个选项只查找 URL 的 DNS 记录。即使没有网络服务器侦听该 IP,它也会 return 为真。
- 第二个选项将对网络服务器执行 ping 操作,但您不能保证允许 ping 操作(这会产生误报)或者响应的设备是实际的网络服务器(这会产生误报)。
- 第一个选项将与网络服务器对话以验证页面,但并非所有服务器都会正确响应
HEAD
请求(在这种情况下这可能是您的问题)。这仍然会有误报和漏报,但比上面的选项要好。 - 第一个选项的变体是将 HTTP 方法更改为
GET
请求。这将向网络服务器询问实际的网页。这将给出最正确的答案,看看该网页是否存在,但总会有一些情况你得不到正确答案。