检查服务器是否可以在.NET中访问的最佳方法?
时间:2020-03-06 14:44:21 来源:igfitidea点击:
我在C中创建了一个timeclock应用程序,该应用程序连接到服务器上的Web服务,以便为员工定时上班或者下班。该应用程序驻留在系统托盘中,如果用户关闭/挂起了计算机或者空闲了三个小时以上,则将用户时钟排除在外,最后一次活动时,它会将用户时钟排除在外。
我的问题出现了,当用户使计算机从睡眠状态恢复(这会引发SystemEvents.PowerModeChanged事件)时,应用程序将尝试重新安排员工入职,但此时网络连接尚未完全初始化,并且Web服务呼叫超时。
一个明显的解决方案(尽管是hack)是延迟时间,但这并不一定能解决所有问题。我想要做的是一种"无休止"的时钟,它将在其中等待直到看到服务器为止,直到它真正尝试进行时钟输入为止。
确定是否可以建立与Web服务的连接的最佳方法是什么?
解决方案
最好的方法是实际尝试建立连接并捕获错误。我们可以对计算机执行ping操作,但这只会告诉我们计算机是否正在运行以及是否在网络上,而不必反映网络服务是否正在运行以及是否可用。
处理事件时,将连接代码放入将一直循环进行直到成功,捕获错误并重试的方法中。
即使是延迟也不是完美的,因为取决于各个系统和其他运行的应用程序,重新建立网络连接可能需要花费不同的时间。
如果问题是重新建立网络服务的延迟,则使用Ping解决方案;就像敲门铃看看是否有人在家
如果ping成功,则尝试调用Web服务,适当地捕获异常(我认为SocketException和SoapException均可发生,具体取决于就绪/响应能力)
实现一个队列,在该队列中我们发布消息并让线程定期尝试将内存中的队列刷新到Web服务。
尽管Web服务端口已打开,但可以禁用Ping。我不会用这种方法