我正在寻找一种检查服务器是否可用的方法。 我们有一个离线应用程序,可以将数据保存到服务器上,但是如果服务器连接中断(偶尔会发生),我们必须将数据保存到本地数据库而不是在线数据库。 因此,我们需要不断地检查服务器是否仍然可用。
我们在此应用程序中使用C#。
对于sqlconnection.open
的检查并不是一个很好的选择,因为这需要大约20秒才能抛出错误,我们不能等待这么长时间+ 我也正在使用一些http服务。
我正在寻找一种检查服务器是否可用的方法。 我们有一个离线应用程序,可以将数据保存到服务器上,但是如果服务器连接中断(偶尔会发生),我们必须将数据保存到本地数据库而不是在线数据库。 因此,我们需要不断地检查服务器是否仍然可用。
我们在此应用程序中使用C#。
对于sqlconnection.open
的检查并不是一个很好的选择,因为这需要大约20秒才能抛出错误,我们不能等待这么长时间+ 我也正在使用一些http服务。
只需使用System.Net.NetworkInformation.Ping类。 如果您的服务器不响应ping(出于某种原因,您决定阻止ICMP Echo请求),则必须为此发明自己的服务。 就个人而言,我赞成不要阻止ICMP Echo请求,并认为这是正确的方法。ping命令已经被用来检查主机的可达性。
using System.Net.NetworkInformation;
var ping = new Ping();
var reply = ping.Send("google.com", 60 * 1000); // 1 minute time out (in ms)
// or...
reply = ping.Send(new IPAddress(new byte[]{127,0,0,1}), 3000);
PING
服务器或获取 HTTP
响应(如其他答案中所建议的),除非您成功建立到数据库的连接,否则您的进程将失败。您提到检查数据库连接需要太长时间,为什么不只需更改应用程序连接字符串中的 Connection Timeout
设置为更短的值,例如5秒 (Connection Timeout=5
)?你现在正在做的是:
如何确定服务器是否可用?使用 catch 块。这是编码最简单的方法。
我会让你自己判断与并发约束相关的其他应用程序问题,然后选择解决方案。
既然你想要确定数据库服务器是否存在,可以在尝试连接到数据库时捕获任何错误,或者使用套接字并尝试在某个服务上与服务器进行原始连接。我建议使用数据库作为资源。
.Net Core 7
你可以使用以下方法检查 ICMP 的结果:
if (reply.Status != IPStatus.Success)
public async Task<OperationResult<bool>> CheckIsActive(List<Server> servers)
{
try
{
var ping = new Ping();
foreach (var server in servers)
{
var reply = ping.Send(server.ServerUrl, 60 * 1000);
if (reply.Status != IPStatus.Success)
await server.SetDownServer();
}
return OperationResult<bool>.OnSuccess(true);
}
catch (Exception exception)
{
return OperationResult<bool>.OnException(exception);
}
}