测试URI是否已启动

时间:2010-10-15 08:16:34

标签: c# uri ping

我正在尝试创建一个简单的应用程序来“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;
    }

是否有任何现有代码可以更好地满足这种需求?

3 个答案:

答案 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"); 
    }