检查服务器是否存在

时间:2010-03-12 13:06:28

标签: c# .net

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

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

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

有没有更好的方法呢?任何想法都会受到欢迎。

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

6 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

是否可以使用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();
    }
}

答案 3 :(得分:0)

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

唯一的缺点是,如果服务器确实存在,而且它正在受到重创,那么你可能会得到假阴性。但这很少成为问题。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

您可以使用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;
  }
}