如何在C#中检查网站是否在线?

42

我希望我的C#程序在执行之前能够检查一个网站是否在线,我应该如何让我的程序ping这个网站并且在C#中检查是否有响应?


5
在MSDN上的Ping类页面中,既有同步示例,也有异步示例。 - drew010
2
你也可以使用WebClient类请求资源或URL。Ping并不一定意味着网站在线,除非你只想检查服务器是否正常。 - lahsrah
那也可能意味着您的机器离线了。或者,您可以使用像 http://doj.me/ 这样的网站。 - BrokenGlass
我选择检查服务器是否在线,因为我的程序只需要检查服务器是否在线,而不是网站。如果我的问题表述不清,对此我表示抱歉。 - Alper
5个回答

70

一个ping命令只能告诉你端口是否活跃,但无法确定该端口是否真的是一个web服务。

我的建议是对该URL执行HTTP HEAD请求。

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("your url");
request.AllowAutoRedirect = false; // find out if this site is up and don't follow a redirector
request.Method = "HEAD";
try {
    response = request.GetResponse();
    // do something with response.Headers to find out information about the request
} catch (WebException wex)
{
    //set flag if there was a timeout or some other issues
}

这并不会实际获取HTML页面,但它将帮助您找出您需要知道的最小信息。如果代码无法编译,抱歉,这只是我脑海中的想法。


15
好的。顺便说一下,对于那些关心的人,实际上有一个名为“HEAD”的常量可用。System.Net.WebRequestMethods.Http.Head。 - Dave Jellison

60

您需要使用 System.Net.NetworkInformation.Ping,如下所示。

var ping = new System.Net.NetworkInformation.Ping();

var result = ping.Send("www.google.com");

if (result.Status != System.Net.NetworkInformation.IPStatus.Success)
    return;

12
Ping不能告诉您一个网站是否在线,只能告诉您它的网络协议栈是否有响应。而且,您正在将一个HTML URL传递给ping,这是不合法的。 - Erik Funkenbusch
1
这绝对是最好的答案,而且由于该类甚至被称为“Ping”,因此很可能也是最正确的答案。谢谢你的帮助。此外,如果将来有人阅读此内容,请访问以下链接以获取手册:http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx - Alper
对我来说它不起作用 - 它会抛出异常(当主机不可用时),而不是简单地处理它并返回相应的IPStatus值。 - Laserson
7
由于许多企业服务器会阻止ping命令,因此这并不是一种检测网站是否联机的好方法。 - davehay
当我尝试访问一个合法的本地服务:http://localhost:port时,它对我不起作用。 - Mugen
这只是告诉您服务器是否响应ping请求。这绝不意味着网站是否在线。是的,有一些服务器配置为丢弃ping请求。 - waka

23

对Digicoder的代码进行小备注并提供Ping方法的完整示例:

private bool Ping(string url)
{
    try
    {
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
        request.Timeout = 3000;
        request.AllowAutoRedirect = false; // find out if this site is up and don't follow a redirector
        request.Method = "HEAD";

        using (var response = request.GetResponse())
        {
            return true;
        }
    }
    catch
    {
        return false;
    }
}

1
如果服务器设置不允许我在特定服务器上发送http请求怎么办? - Anirudha Gupta
1
如果您正在测试一个不允许 HEAD 但允许 GET 或 POST 的服务器,那么您将得到一个错误的结果。 - Vlad
谢谢你的回答。你帮了我很多 :) - Yaniv Ofer

9
if (!NetworkInterface.GetIsNetworkAvailable())
{
    // Network does not available.
    return;
}

Uri uri = new Uri("http://stackoverflow.com/any-uri");

Ping ping = new Ping();
PingReply pingReply = ping.Send(uri.Host);
if (pingReply.Status != IPStatus.Success)
{
    // Website does not available.
    return;
}

首先,为NetworkInterfaceGetIsNetworkAvailable()添加简单的检查,以便进行点赞。 - LucasS
6
对于坚持认为ping响应与网站可用性有关的误解进行负评。 - spender

1
我能想到的最简单的方法是这样的:
WebClient webClient = new WebClient();
byte[] result = webClient.DownloadData("http://site.com/x.html");

如果网站不在线,DownloadData将抛出异常。

可能有一种类似的方法只需ping网站,但是除非您每秒钟检查多次,否则不太可能注意到差异。


11
为了验证网站是否在线,您不应该下载整个页面。 - BrokenGlass
Webclient对我来说比httpwebrequest更好用,因为在遇到503错误后,httpwebrequest一直抛出503错误,而webclient则可以正常工作。 - bert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接