【问题标题】:C# Check Remote ServerC# 检查远程服务器
【发布时间】:2009-06-25 11:09:10
【问题描述】:

如果远程服务器可用,任何人都可以建议检查(使用 .NET 3.5)的最佳方法是什么?

我正在考虑使用以下代码,但如果社区有其他选择,我想知道是否存在更好的方法。

TcpClient client = new TcpClient("MyServer", 80);
if (!client.Connected)
{
    throw new Exception("Unable to connect to MyServer on Port 80");
}
client.Close();

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    你可以ping

    你可以通过它download the default page

    您可以提出HEAD 请求

    如果它是您网络上的本地 IIS6 服务器,并且您有一些管理员详细信息,您可以使用一些 DirectoryEntry 代码 connect to IIS

    136615 上的一些答案可能也有帮助,特别是关于 sockets 的公认答案

    对于打印服务器(或者,特别是打印机),K Scott here 的代码可能会有所帮助。无论如何,这是一个有趣的代码 :-) 该代码提到了 dns.resolve,它已过时并被 Dns.GetHostEntry 取代

    我快没主意了:-)

    【讨论】:

      【解决方案2】:

      如果您只是想查看给定服务器是否在线,那么在大多数情况下,简单的 ping 就可以完成这项工作。

      PingReply pingReply;
      using (var ping = new Ping())
          pingReply = ping.Send("http://www.stackoverflow.com/");
      var available = pingReply.Status == IPStatus.Success;
      

      使用这种方法,您也不会以任何方式滥用 HTTP 服务器。

      否则(如果您想检查是否可以在特定端口上建立连接),那基本上看起来没问题。

      【讨论】:

      • 我的印象是在公司 Intranet 或防火墙网络中不建议使用 Ping 对象?我可能应该把我想在公司网络上检查可用性。有人可以评论吗?
      • @Kane:为什么不建议这样做? ping 是检查主机可用性的标准、经过试验和测试的方法。打开大量 HTTP 连接并且什么都不做更有可能构成滥用/恶意。如果 ping 端口是关闭的,那就另当别论了 - 但是,它应该是打开的。
      • 我认为如果防火墙阻止了 Ping (ICMP Echo) 数据包,Ping 可能无法工作?我真的不知道这是真的吗?
      • 诚然,我不在公司网络上工作,但我没有看到我可以访问的任何大型学术机构网络上的 ping 被阻止。这可能是因为网络管理员经常使用 ping 来检查网络连接
      • 许多公司在防火墙上阻止 ICMP,这意味着您无法 ping 外部站点。我目前工作的网站正是这样做的。 Ping 只是告诉您该服务器是否正在积极响应 ICMP Echo。如果您正在测试 Web 服务器,则对服务的请求会告诉您服务是否正常工作,这与响应 ICMP Echo 不同。
      【解决方案3】:

      只是为了补充丹的答案...... 我只需要实现它,这里有一个不错的小代码 sn-p,它应该可以帮助那些从 Google 实现它的人。

      Imports System.Net
      Private Function URLExists(pURL As String) As Boolean
      
          Try
              'Creating the HttpWebRequest
              Dim request As HttpWebRequest = TryCast(WebRequest.Create(pURL), HttpWebRequest)
              'Setting the Request method HEAD, you can also use GET too.
              request.Method = "HEAD"
              'Getting the Web Response.
              Dim response As HttpWebResponse = TryCast(request.GetResponse(), HttpWebResponse)
              'Returns TURE if the Status code == 200
              Return (response.StatusCode = HttpStatusCode.OK)
          Catch
              'Any exception will returns false.
              Return False
          End Try
      End Function
      

      对不起,它是 VB,但这就是我面前的东西。我将把它作为练习留给读者根据需要将其转换为 C#。

      【讨论】:

        【解决方案4】:

        如果您使用的是以前版本的 .NET Framework,比如我,版本 2,您将没有 Ping 和 System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()。然后,您可以使用HttpWebRequest 来检查主机的责任:

          public static bool AccessToWebService()
          {
              string host = "http://192.168.99.41";
              try
              {
                  HttpWebRequest request = (HttpWebRequest) WebRequest.Create(host);
                  request.Method = "HEAD";
                  HttpWebResponse response = (HttpWebResponse) request.GetResponse();
                  return response.StatusCode == HttpStatusCode.OK;
              }
              catch (Exception)
              {
                  return false;
              }
          }
        

        【讨论】:

          【解决方案5】:

          我猜您想查看网站是否可用。您可以使用System.Net.WebRequest 并检查结果。

          更新: 根据您的评论,如果您有一些服务器(和服务)要监控,那么使用 NagiosHostMonitorIPSentry 之类的包可能会更好,而不是滚动您的自己的。

          【讨论】:

          • 我需要检查一些服务器。其中一些是 Web 服务器,一些是基于 Windows 的简单文件/打印服务器。
          猜你喜欢
          • 1970-01-01
          • 2012-10-28
          • 1970-01-01
          • 2017-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-23
          相关资源
          最近更新 更多