我开发了中间件,为我们组织内多个平台上的多个客户端应用程序提供 RPC 功能。中间件是用 C# 编写的,并作为 Windows NT 服务运行。它处理诸如对网络共享的文件访问、数据库访问等事情。中间件托管在两个运行 Windows Server 2008 的高端系统上。
当我们的一位服务器管理员重新启动机器时,主要是为了进行 Windows 更新,系统在我的 NT 服务方面的行为存在严重问题。我的服务旨在立即停止侦听新连接,立即开始拒绝现有连接上的新请求,否则在 SCM 发出 OnStop 或 OnShutdown 请求的情况下尽快关闭。尽管如此,为了保持系统完整性,当前正在进行的操作仍可继续进行一段合理的时间。通常服务器会在 30 秒内关闭(例如手动停止服务时)。但是,当系统被指示重新启动时,我的服务立即失去对网络驱动器和 UNC 路径的访问权限,导致任何打开的文件和对这些位置的部分写入的数据完整性问题。我的服务确实将 Workstation(以及因此 SMB Redirector)列为依赖项,因此我认为如果 Windows 尊重这些依赖项,则需要在停止 Workstation/Redirector 之前停止我的服务。
基本上,我的应用程序被迫崩溃和烧毁,远程过程调用失败,并最终在超时时间过后(似乎大约为 20-30 秒)被操作系统强制终止。
与 Windows 应用程序不同,我的 Windows NT 服务似乎没有任何能力来停止正在进行的系统关闭、延迟系统关闭,甚至没有机会在被强制断开连接和关闭之前保存任何挂起的网络共享磁盘写入. NT 服务开发人员应该如何在这种环境中拥有任何类型的应用程序完整性?为什么表单应用程序在关闭之前获得了所有完成业务的机会,而服务似乎没有这样的好处?
我试过了:
通过 p/invoke 调用 SetProcessShutdownParameters 以尝试尽快通知我的应用程序关闭,以避免重定向器在我之前关闭。
使用小于或等于两分钟限制的值调用 ServiceBase.RequestAdditionalTime。
调整 WaitToKillServiceTimeout
我能想到的一切都能让我的服务更快地关闭。
但最后,我仍然有大约 30 秒的问题时间,我的服务似乎还没有收到 OnShutdown 事件的通知,但由于重定向器不再为我的网络共享请求提供服务,请求失败。
这个问题打算如何解决?我可以做些什么来延迟或停止关闭,或者至少允许关闭我的活动任务而不会从我下面消失重定向器服务?我可以理解微软试图做些什么来防止服务拖拖拉拉并显示关闭,但这似乎是 Windows 客户端操作系统的一个伟大目标,而不是服务器。我不希望我的服务器快速关闭,我希望操作完整性和正常关闭。
提前感谢您提供的任何帮助。
更新:我已经完成了确切的时间安排。在测试关机中,我在 23:55:58 收到关机通知,并注意到在 23:56:02 失去了网络共享连接。所以在四秒钟之内,我就失去了保存任何活动状态的能力。