【问题标题】:Check if server exists检查服务器是否存在
【发布时间】:2010-03-12 13:06:27
【问题描述】:

这就是问题所在。用户可以输入数据库的服务器名称和连接字符串。 如果服务器无法访问(地址错误、防火墙或任何其他问题),我希望尽快意识到这一点。

如果我使用 sqlConnection 并尝试连接到不可访问的服务器,这需要很长时间(我认为超过 1 分钟!)。顺便说一句,这与连接超时无关,因此设置此属性无济于事。

我的想法是首先尝试 ping 服务器,如果我得到响应(这意味着服务器可以从应用程序点访问),然后继续使用 sqlConnection。如果 ping 没有响应,操作将中止并正确通知用户。

有没有更好的方法来做到这一点?欢迎任何想法。

忘了指出,我使用的是 NHibernate,所以我不能使用任何 MSSQL 特定的库。此外,目标服务器可以使用 Linux 作为操作系统,而不仅仅是 Windows。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    这个previous question's answer has a decent approach 比 ping 更优雅,使用 WMI 将为您提供更多信息

    【讨论】:

    • 这会假设目标系统上有 Windows 操作系统,对吗?如果是这样的话,我就不能使用这种方法了。
    • 确实如此,这完全是以 Windows 为中心的......因为 mysql 在 linux 上的方法很可能与 Windows 上的 oracle 或任何其他组合完全不同
    【解决方案2】:

    您能否使用 SqlDataSourceEnumerator 获取包含所有可用 SQLServer 的 DataTable,然后根据列表检查用户输入。像这样的东西。 See MSDN.

    System.Data.DataTable table = VisibleServerList.GetVisibleServers();
    
    public static class VisibleServerList
    {
        public static System.Data.DataTable GetVisibleServers()
        {
            System.Data.Sql.SqlDataSourceEnumerator instance = System.Data.Sql.SqlDataSourceEnumerator.Instance;
            return instance.GetDataSources();
        }
    }
    

    【讨论】:

    • 在我拥有的这个应用程序中,我使用 NHibernate for ORM,所以我对 MSSQL 服务器不感兴趣。
    【解决方案3】:

    我认为值得注意的是,检查通用数据库的存在和可访问性的唯一真正好方法是访问它。例如,一台机器可以配置一个完美运行的数据库,并拒绝 ping。同样,一台机器可能正在运行一个数据库实例并被配置为忽略/拒绝所有 WMI 查询。如果您可以为您的环境假设这些不正确(即,您知道您公司的所有机器总是会应答 ping),那么您可以继续;否则,您可能只需要点击“尝试连接”即可。

    【讨论】:

    • 目前我已经接近接受 ping 作为一个足够好的解决方案。当然,我知道这不是防弹解决方案,所以我希望有其他方法可以实现我的目标。我无法对部署环境、服务器操作系统或数据库做出任何假设,因此我需要一些通用方法来确定服务器是否存在。
    【解决方案4】:

    创建与服务器的连接时,将连接超时设置为 2 或 3 秒。这样,如果服务器实际上不在那里,它会更快地退出。

    唯一的缺点是如果服务器确实存在,并且它正在被锤击,那么你可能会得到一个假阴性。但这很少有问题。

    【讨论】:

    • 正如我在原始帖子中所写的,设置连接超时只有在服务器存在时才有帮助。如果应用程序无法访问服务器(出于任何原因 - 例如无效的服务器名称或防火墙),则连接超时不会影响连接尝试的持续时间。
    【解决方案5】:

    最后,我决定采用混合方法。当用户点击“连接”按钮时,将在用户进入的服务器上执行 ping。如果服务器没有响应(可以很快检测到),用户将收到服务器似乎无法访问的消息,以及是否要继续并尝试连接到该服务器的问题。

    基本上,用户将决定是否等待“尝试连接”。

    【讨论】:

      【解决方案6】:

      您可以只使用 TcpClient 类来查询服务器并检查特定端口是否打开,可能是这样的:

      using System.Net;
      using System.Net.Sockets;
      
      public bool CheckServerAvailablity(string serverIPAddress, int port)
      {
        try
        {
          IPHostEntry ipHostEntry = Dns.Resolve(serverIPAddress);
          IPAddress ipAddress = ipHostEntry.AddressList[0];
      
          TcpClient TcpClient = new TcpClient();
          TcpClient.Connect(ipAddress , port);
          TcpClient.Close();
      
          return true;
        }
        catch
        {
          return false;
        }
      } 
      

      【讨论】:

        猜你喜欢
        • 2014-12-12
        • 1970-01-01
        • 2010-11-03
        • 2013-01-16
        • 2014-07-01
        • 2016-02-29
        • 1970-01-01
        • 1970-01-01
        • 2012-04-22
        相关资源
        最近更新 更多