【问题标题】:How do you check if a website is online in C#?如何在 C# 中检查网站是否在线?
【发布时间】:2011-09-23 02:47:48
【问题描述】:

我希望我的 C# 程序在执行之前检查网站是否在线,如何让我的程序 ping 网站并检查 C# 中的响应?

【问题讨论】:

  • 在 MSDN 的 Ping Class 页面上有同步和异步示例。
  • 您还可以使用 WebClient 类并请求资源或 url。 Ping 并不一定意味着网站在线,除非您只是想检查服务器是否已启动。
  • 这也可能意味着您的机器处于离线状态。或者,您可以使用doj.me 之类的网站
  • 我去检查服务器是否在线,因为我的程序只需要检查服务器是否在线,而不是网站,抱歉,如果我的问题措辞不佳。

标签: c#


【解决方案1】:

Ping 只告诉你端口是活动的,它不会告诉你它是否真的是一个网络服务。

我的建议是对 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 页面,但它会帮助您找出您需要知道的最少内容。抱歉,如果代码无法编译,这只是我的想法。

【讨论】:

  • 完美。顺便说一句,对于那些关心的人来说,实际上有一个“HEAD”的常量。 System.Net.WebRequestMethods.Http.Head.
【解决方案2】:

您已使用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;

【讨论】:

  • Ping 不会告诉你一个网站是否在线,只告诉你它的网络堆栈是否有响应。更重要的是,您将 HTML URL 传递给 ping,这是不合法的。
  • 这是迄今为止最好的答案,而且看到该课程甚至被称为“Ping”,它也可能是最正确的答案。谢谢您的帮助。此外,如果将来有人阅读此内容,请参阅手册链接:msdn.microsoft.com/en-us/library/…
  • 对我来说它不起作用 - 它抛出异常(当主机不可用时)而不是简单地处理它并返回相应的 IPStatus 值
  • 由于很多企业服务器阻止 ping,这不是检测站点是否在线的好方法。
  • 在尝试访问合法的本地服务时对我不起作用:localhost:port
【解决方案3】:

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;
    }
}

【讨论】:

  • 如果服务器设置不允许我在特定服务器上发送 httprequest 怎么办?
  • 如果您正在测试一个不允许 HEAD 但允许 GET 或 POST 的服务器,您会得到误报。
  • 感谢您的回答。你帮了我很多:)
【解决方案4】:
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() 进行简单检查
  • 投反对票,因为它延续了 ping 响应与网站可用有关的神话。
【解决方案5】:

我能想到的最简单的方法是:

WebClient webClient = new WebClient();
byte[] result = webClient.DownloadData("http://site.com/x.html");

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

可能有类似的方法来 ping 站点,但除非您每秒检查多次,否则差异不太可能会很明显。

【讨论】:

  • 您不必为了验证网站是否已启动而下载整个页面
  • webclient 比 httpwebrequest 更适合我,在遇到错误 503 后,httpwebrequest 在 webclient 再次工作时不断抛出 503。
猜你喜欢
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多