在我的Windows 窗体应用程序(启动时)中,我使用 ping 命令检查 Internet 连接和我的SQL Server是否都处于活动状态。
在 .NET 框架 2.0 中,我应该使用任何“更好”的方式命令来完成上述任务吗?
在我的Windows 窗体应用程序(启动时)中,我使用 ping 命令检查 Internet 连接和我的SQL Server是否都处于活动状态。
在 .NET 框架 2.0 中,我应该使用任何“更好”的方式命令来完成上述任务吗?
只需向您的 SQL 服务器发出一个小而简单的请求,以查看连接是否有效。除此之外,如果您的连接超时或以其他方式失败,为什么不只是一个合理处理的异常来启动呢?
Ping 只能用于验证数据包是否可以到达目的地,但不适用于检查实际服务器是否正常运行。
如果您的服务器配置为提供 SNMP,则最好选择获取 SNMP 信息以了解您的服务器是否可运行。
然而,对 SNMP 进行编程并不是一项简单的任务。如果你真的需要这些好处,那就去吧。
这是一个示例代码:
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;
}
来源:我自己的博客
对于 SQL Server,最好“尝试连接”。
在不执行命令的情况下检查网络和 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 对象时,如果可用连接可用,则从池中获取该对象。为了可用,连接必须未被使用,具有匹配的事务上下文或与任何事务上下文无关,并且具有到服务器的有效链接。
如果这还不够,Pooling=false
请在连接字符串中进行设置以确保。
测试互联网连接。System.Net 有很多有用的功能。HttpWebRequest
功能将尝试加载网站,您将获得用于测试连接的详细响应。
要非常小心,将此作为启动逻辑。我已经看到像这种退化为心跳逻辑的事情,它还有很多其他有趣的问题。其中之一是,如果您的应用程序将有许多正在运行的实例。如果您的应用在大型环境中使用并且可能有数千个实例正在运行,那么心跳逻辑可能会增加网络和服务器负载。或者有时心跳间隔是可配置的,有人将其设置为零或其他一些疯狂的值。
还有一点,我已经看到了这一点,其中数据库服务器的问题是服务器上的时间。即选择GetDate()
这有两件事,首先,如果你得到答案,你就知道服务器和网络正在工作。其次,如果您有一些时间关键的操作,您可以测量客户端机器和数据库服务器之间的时钟偏差。有时了解这一点很重要。