0

我正在尝试制作一个简单的应用程序,它将“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;
    }

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

4

3 回答 3

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 代码也成功。

于 2010-10-15T10:24:43.383 回答
1

您可以使用一个 Ping 类,更多详细信息可以在这里找到:http: //msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx

于 2010-10-15T08:55:45.717 回答
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"); 
    } 
于 2010-10-15T10:18:39.103 回答