检查Windows服务是否已被强制关闭或崩溃

时间:2009-11-11 10:31:55

标签: c# .net windows-services

我有一个用C#.NET framework 3.5编写的Windows服务,想知道检查以前关闭服务的最佳方法。

启动服务时,应该检查上次关机是否是常规的(通过服务管理中的停止服务按钮),或者是否有人刚刚杀死了该进程(或者由于某些原因而没有直接链接到服务本身而崩溃)

我考虑过在启动服务时在硬盘上编写加密的XML,然后在停止服务时使用一些值编辑它。以这种方式,在我下次再次启动服务后,我可以检查XML并查看在关闭期间是否以正确的方式编辑了值,如果不是,我知道该进程已被终止或崩溃。

这种方式似乎太不可靠,也不是一种好的做法。你有什么建议?

澄清: 该服务的作用是它位于服务器上并侦听来自客户端计算机的连接。建立连接后,它将通过Web服务与远程数据库通信,并确定他们是否有权连接(因此使用作为调用者的应用程序)。保护的一个方面是并发检查,如果我将限制设置为5个工作站,我将TcpClient连接从Windows服务保持活动状态,比如5个工作站,第六个工作站无法连接。

如果我终止服务进程并重新启动它,连接就消失了,我在工作站上运行了5个“许可”应用程序,现在又有5个免费连接插槽需要5个以上。

5 个答案:

答案 0 :(得分:2)

我也无法使用文件看到任何不好的内容。您甚至可以使用此文件来记录更多信息。

EG。您可以附加到AppDomains Unhanded Exception事件并尝试记录该异常。 或者您可以评估您的服务运行/未运行的日志(解析该任务的日志文件有点困难)。

当然 - 这不是不使用日志文件的借口。

答案 1 :(得分:2)

我最终还是这样做了: 用于检查连接的工作站以查看它们是否存活的服务,但现在我已经从所有工作站进行了定期检查(它们通过我在检查中构建的公共路由器dll连接)。每10秒验证一次连接,如果没有,客户端将尝试在15秒内重新连接,如果只有一个临时网络问题,这将成功,但如果服务被强制关闭将会失败(因为所有它的Tcp对象将会丢失。)

答案 2 :(得分:1)

我建议使用EventLog。在服务启动或停止时添加日志事件,并读取事件日志以检测异常。

以下是CodeProject的基本示例。 这是walkthrough from MSDN如何创建/删除/读取事件日志和条目。

答案 3 :(得分:0)

除非服务运行某种安全系统,你需要有一个“篡改”证明系统,我不明白为什么使用文件是一个糟糕的解决方案。

Personaly我认为加密的xml文件过度,一个简单的文本文件就足够了。

答案 4 :(得分:0)

我认为你走在正确的轨道上,我不确定你为什么要编辑这些值,只需使用文件(或注册表项)作为标记来指示服务已经启动并且正在运行。在正常关机期间,请移除标记。然后,您只需要查找标记的存在,以了解您是否正常关闭或崩溃。

如果发现文件未可靠创建,请确保关闭并刷新和处理文件对象,而不是依赖垃圾收集器。

---编辑后澄清---

因此,要求是许可系统,而不仅仅是确定服务是否正常关闭。我猜想,要求在正常关机时清除“许可证”并在崩溃后恢复,这些方案是可以互换的。

我可能会使用具有适当安全性的数据库后备存储来保存服务器上的许可证密钥。当每个客户端连接并请求许可证时,它们被提供有必须为来自客户端的每个通信呈现的密钥。服务器显然正在验证所呈现的密钥对当前会话是否有效。如果服务器正常关闭,它可以清除密钥表,如果它崩溃,那么密钥仍然存在并且可以兑现。这可能是我能想到的最安全的最简单方法。

如果故事还有更多内容,请告诉我们。