检查服务器是否存在。

4
这里有一个问题,用户可以输入服务器名称和数据库连接字符串。如果服务器无法访问(地址错误、防火墙或任何其他问题),我希望尽快知道。
如果我使用sqlConnection并尝试连接到不可访问的服务器,这需要很长时间(我认为超过1分钟!)。这与连接超时无关,因此设置此属性将无法帮助。
我的想法是首先尝试ping服务器,如果我得到响应(这意味着从应用程序的角度来看服务器是可访问的),然后继续使用sqlConnection。如果没有来自ping的响应,则操作被中止,并通知用户。
有更好的方法吗?欢迎任何想法。
忘记指出,我正在使用NHibernate,因此无法使用任何MSSQL特定库。另外,目标服务器可以拥有Linux作为操作系统,而不仅仅是Windows。
6个回答

4

这将假设目标系统上有Windows操作系统,对吗?如果是这种情况,那么我不能使用这种方法。 - buhtla
这是非常正确的,这完全是以Windows为中心的...因为在Linux上使用MySQL的方法很可能与在Windows上使用Oracle或其他任何组合的方法完全不同。 - curtisk

2
你可以使用SqlDataSourceEnumerator来获取包含所有可用SQL服务器的DataTable,然后将用户输入与列表进行比较。类似于这样的操作。 请参阅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进行ORM,因此我不仅仅对MSSQL服务器感兴趣。 - buhtla

1

我认为值得注意的是,检查通用数据库的存在和可访问性的唯一真正好的方法是访问它。例如,机器可以配置一个完全操作的数据库,但拒绝ping请求。同样,机器可能正在运行DB实例,并配置为忽略/拒绝所有WMI查询。如果您可以假设这些情况在您的环境中不成立(即,您知道所有公司的机器都将始终回答ping请求),那么您可以继续;否则,您可能只能承受“尝试连接”的打击。


此刻我已经接近接受ping作为足够好的解决方案。当然,我知道这不是百分之百可靠的解决方案,所以我希望有其他方法来实现我的目标。 我不能对部署环境、服务器操作系统或数据库做出任何假设,因此我需要一种通用的方法来确定服务器的存在。 - buhtla

1

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

0
在创建与服务器的连接时,将连接超时设置为2或3秒钟。这样,如果服务器实际上不存在,它将更快地退出。
唯一的缺点是,如果服务器存在并且正在被攻击,那么您可能会得到一个错误的负面结果。但这很少是一个问题。

正如我在原帖中所写的那样,设置连接超时只有在服务器存在时才有帮助。如果应用程序无法访问服务器(由于任何原因 - 例如无效的服务器名称或防火墙),连接超时对连接尝试的持续时间没有影响。 - buhtla

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接