我正在尝试创建一个简单的应用程序来“ping”uri并告诉我它是否响应
我有以下代码,但它似乎只检查根级别的域
即www.google.com而不是www.google.com/voice
private bool WebsiteUp(string path)
{
bool status = false;
try
{
Uri uri = new Uri(path);
WebRequest request = WebRequest.Create(uri);
request.Timeout = 3000;
WebResponse response;
response = request.GetResponse();
if (response.Headers != null)
{
status = true;
}
}
catch (Exception loi)
{
return false;
}
return status;
}
是否有任何现有代码可以更好地满足这种需求?
答案 0 :(得分:2)
编辑:实际上,我说谎 - 默认情况下404应该导致网络异常,我刚刚确认了这一点,以防我记错了。虽然示例中给出的代码是漏洞,但它仍然可以工作。令人费解,但我会在这里留下这个答案,以便更好地使用响应对象。
您拥有的代码存在的问题是,虽然它确实检查了给定的精确URI,但它认为404,500,200等同样“成功”。使用GET来完成HEAD工作也有点浪费。它应该真正清理WebResponse。对于不仅仅是路径的东西,术语path
是一个愚蠢的参数名称,而我们就是它。
private bool WebsiteUp(string uri)
{
try
{
WebRequest request = WebRequest.Create(uri);
request.Timeout = 3000;
request.Method = "HEAD";
using(WebResponse response = request.GetResponse())
{
HttpWebResponse hRes = response as HttpWebResponse;
if(hRes == null)
throw new ArgumentException("Not an HTTP or HTTPS request"); // you may want to have this specifically handle e.g. FTP, but I'm just throwing an exception for now.
return hRes.StatusCode / 100 == 2;
}
}
catch (WebException)
{
return false;
}
}
当然,那里的穷人网站总是返回200,依此类推,但这是最好的网站。它假设在重定向的情况下,你关心重定向的最终目标(你最终是在一个成功的页面或错误页面上),但如果你关心特定的URI,你可以关闭自动重定向跟随,并考虑3xx代码也是成功的。
答案 1 :(得分:1)
您可以使用Ping类,可在此处找到更多详细信息: http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx
答案 2 :(得分:0)
当我编写一个torrent客户端来检查有效的跟踪器URL时,我做了类似的事情,很确定我在SO上找到了答案,但似乎无法再找到它了,继承了该帖子中的代码示例。
using(var client = new WebClient()) {
client.HeadOnly = true;
// exists
string Address1 = client.DownloadString("http://google.com");
// doesnt exist - 404 error
string Address2 = client.DownloadString("http://google.com/sdfsddsf");
}