【问题标题】:What should I use instead of ping?我应该使用什么来代替 ping?
【发布时间】:2010-12-06 23:20:25
【问题描述】:

在我的Windows Forms 应用程序中(启动时),我使用 ping 命令检查 Internet 连接和我的 SQL Server 是否都处于活动状态。

在 .NET 框架 2.0 中我应该使用任何“更好”的方式命令来完成上述任务吗?

【问题讨论】:

    标签: sql-server vb.net winforms internet-connection


    【解决方案1】:

    要非常小心,将此作为启动逻辑。我已经看到像这种退化为心跳逻辑的事情,它还有很多其他有趣的问题。其中之一是,如果您的应用程序将有许多正在运行的实例。如果您的应用程序在大型环境中使用并且可能有数千个实例正在运行,那么心跳逻辑可能会增加网络和服务器负载。或者有时心跳间隔是可配置的,有人将其设置为零或其他一些疯狂的值。

    另外一点,我看到数据库服务器的问题是它在服务器上的时间是什么时候结合在一起的。即选择 GetDate()

    这做了两件事,首先,如果你得到答案,你就知道服务器和网络正在工作。其次,如果您有一些时间关键的操作,您可以测量客户端机器和数据库服务器之间的时钟偏差。有时了解这一点很重要。

    【讨论】:

      【解决方案2】:

      这是一个示例代码:

      private bool IsInternetAvailable()
              {
                  bool ret = false;
      
                  try
                  {
                      HttpWebRequest req = (HttpWebRequest)
                  HttpWebRequest.Create("http://www.yourremoteserver.com/");
                      HttpWebResponse res 
                  = (HttpWebResponse)req.GetResponse();
                      if (res.StatusCode == HttpStatusCode.OK)
                      {
                          ret = true;
                      }
                      else
                      {
                          ret = false;
                      }
                      res.Close();
                  }
                  catch
                  {
                      ret = false;
                  }
      
                  return ret;
              }
      

      来源:my own blog

      对于 SQL Server,最好“尝试连接”。

      【讨论】:

      • 如果 Google 宕机了怎么办?它发生了
      • 您需要始终使用“您的远程”服务器。谷歌链接只是一个例子。
      【解决方案3】:

      在不执行命令的情况下检查网络和 MS-SQL Server:

      // Setup a timer to call as needed
      public bool IsSqlConnectionOpen(string connectionString)
      {
          bool open = false;
          using (var connection = new SqlConnection(connectionString))
          {
              try
              {
                  connection.Open();
                  open = true;
                  connection.Close();
              }
              catch (SqlException e)
              {
                  // log e.ToString()
              }
          }
          return open;
      }
      

      修改了我用来获取 SQL Server 版本的代码。

      更新:mattcodes 根据MSDN 提出了一个关于连接池的好观点

      当发生致命错误(例如故障转移)时,池会自动清除。

      当请求 SqlConnection 对象时,如果可用连接可用,则从池中获取该对象。为了可用,连接必须未被使用,具有匹配的事务上下文或与任何事务上下文无关,并且具有到服务器的有效链接。

      如果这还不够,请在connection string 中设置Pooling=false 以确保。

      【讨论】:

      • 是否存在从连接池返回一个的风险,该连接池随后在超时期间成为客户端和服务器之间的传输或其他问题的牺牲品?
      【解决方案4】:

      只需向您的 SQL 服务器发出一个小而简单的请求,即可查看连接是否正常。除此之外,如果您的连接超时或以其他方式失败,为什么不只是一个合理处理的异常来启动?

      【讨论】:

      • 微软自己做这件事 - 一个 SQL 查询来询问服务器是否还活着。基本上“选择‘你还活着吗?’并解析结果。
      • 如果 ICMP 流量被阻止,Ping 将失败,而数据库连接正常。小的简单请求成语通常是 SELECT 1;对于 MS-SQL 或 SELECT 1 FROM DUAL;用于其他数据库系统。
      【解决方案5】:

      测试互联网连接。 System.Net 有很多有用的功能。 HttpWebRequest 函数将尝试加载网站,您将获得详细的响应以用于测试连接。

      【讨论】:

        【解决方案6】:

        Ping 只能用于验证数据包是否可以到达目的地,但不适用于检查实际服务器是否正常运行。

        如果您的服务器配置为提供 SNMP,则最好选择获取 SNMP 信息以了解您的服务器是否正常运行。

        但是,对 SNMP 进行编程并不是一项简单的任务。如果你真的需要好处,那就去吧。

        【讨论】:

          猜你喜欢
          • 2010-11-05
          • 2012-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-06
          • 1970-01-01
          相关资源
          最近更新 更多