我有两个使用 C# 编写的 Windows 服务,它们遵循相同的模式和方法。
这两种服务都针对 Windows 7 VM 进行了开发测试,并在 Windows Server 2008 VM 上进行了 QA 测试。这两项服务已在这些测试环境下多次安装和卸载,没有问题,但在生产环境 (Windows Server 2008) 中安装后,这两项服务之一拒绝启动。
要安装服务,我们使用 InstallUtil.exe 以及附加到服务的 ServiceInstaller 和 ServiceProcessInstaller 组件。
从表面上看,失败的服务安装成功。 InstallUtil.exe 报告成功并且该服务出现在服务管理单元中。您还可以在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Blah Blah 下的注册表中找到该服务。但是,如果您尝试启动该服务,您会得到以下信息:
网络启动 blah.blah.exe “服务名称无效。”
...或通过服务管理单元... “Windows 无法在本地计算机上启动“Blah Blah”服务。错误 1053:该服务未及时响应启动或控制请求。”
我已将一些事件记录添加到服务类失败服务的构造函数中,但它似乎没有被调用。
由于这是一个生产盒子,盒子上没有 Visual Studio,远程调试是不可能的。
是否有任何其他方法可以让我获得关于为什么失败的服务没有启动的调试信息?
我可能会遇到此类问题还有其他明显的原因吗?
编辑:我还应该提到.. Windows 事件查看器中存在问题的唯一其他证据是来自服务控制管理器的系统日志中的两条消息:
“等待 Blah Blah 服务连接时超时(30000 毫秒)。
“由于以下错误,Blah Blah 服务无法启动: 该服务未及时响应启动或控制请求。”
编辑:已解决 该问题最终成为配置错误和隐藏错误的组合。看我的answer下文了解更多详情。
最佳答案
Jeopardy Answer:“无效的自定义配置与错误的全局异常处理程序相结合如何在 .NET Windows 服务中表现出来?”
想通了。
问题的根本原因是 app.config 中的自定义配置部分无效。我们使用自定义配置部分从 app.config 配置服务,ConfigurationSection 派生类的程序集和命名空间最近发生了变化。
事实证明,我们的生产配置正在错误的程序集中寻找自定义 ConfigurationSection 的定义,并且在未能实例化它时抛出的异常被一个错误隐藏了,在该错误中,在服务生命周期的早期捕获异常会尝试记录到自定义日志而不是应用程序事件日志。 (由于自定义事件日志中不存在事件日志源,这会从全局异常处理程序中抛出另一个异常,并且服务会在构造函数中终止。)
第二个异常没有记录在任何地方,我们只是通过代码检查发现的。
解决方案是修复配置并修改全局异常处理程序,使其仅尝试使用服务名称作为事件日志源来写入应用程序事件日志。 (InstallUtil 将服务名称注册为应用程序日志中的事件日志源。)
感谢大家的帮助!抱歉,这个特定问题最终对我们的设置如此具体。
关于c# - .NET Windows 服务的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3346408/