.NET Windows服务的奇怪问题

时间:2010-07-27 17:54:08

标签: c# debugging windows-services

我有两个用C#编写的Windows服务遵循相同的模式和方法。

这两项服务都针对在Windows Server 2008 VM上测试的Windows 7 VM和QA进行了开发测试。这两种服务在这些测试环境下已经多次安装和卸载,没有问题,但是在生产环境中安装(Windows Server 2008)时,两种服务中的一种拒绝启动。

要安装我们正在使用InstallUtil.exe的服务,ServiceInstaller和ServiceProcessInstaller组件附加到服务。

从各方面来看,失败的服务安装成功。 InstallUtil.exe报告成功,服务显示在服务管理单元中。您还可以在HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Blah Blah下的注册表中找到该服务。但是,如果您尝试启动该服务,则会得到以下结果:

net start blah.blah.exe “服务名称无效。”

...或通过服务快照... “Windows无法在本地计算机上启动”Blah Blah“服务。错误1053:服务未及时响应启动或控制请求。”

我已将一些事件记录添加到服务类失败服务的构造函数中,但似乎没有被调用。

由于这是一个生产盒,盒子上没有Visual Studio,远程调试是不可能的。

我还有其他方法可以获取有关失败服务未启动的原因的调试信息吗?

还有其他明显的原因我可能会看到这种问题吗?

编辑:我还应该提到.. Windows事件查看器中唯一的其他问题证据是来自服务控制管理器的系统日志中的两条消息:

“等待Blah Blah服务连接时达到超时(30000毫秒)。

“由于以下错误,Blah Blah服务无法启动: 该服务未及时响应启动或控制请求。“

编辑:已解决 问题最终是配置错误和隐藏它的错误的组合。有关详细信息,请参阅下面的answer

6 个答案:

答案 0 :(得分:8)

Jeopardy答案:“无效的自定义配置与错误的全局异常处理程序如何在.NET Windows服务中表现出来?”

想出来。

问题的根本原因是app.config中的自定义配置部分无效。我们使用自定义配置部分从app.config配置服务,并且ConfigurationSection派生类的程序集和命名空间最近已更改。

事实证明,我们的生产配置是在错误的程序集中查找自定义ConfigurationSection的定义,并且在未能实例化它时抛出的异常被一个错误隐藏,在该错误中,在服务生命早期捕获的异常会尝试记录到自定义日志而不是应用程序事件日志。 (由于事件日志源在自定义事件日志中不存在,这将从全局异常处理程序中引发另一个异常,并且该服务将在构造函数中死亡。)

第二个异常没有记录在任何地方,我们只通过代码检查找到它。

解决方法是修复配置并修改全局异常处理程序,以便仅使用服务名称作为事件日志源来尝试写入Application事件日志。 (InstallUtil在服务器日志中将服务名称注册为事件日志源。)

感谢大家的帮助!对不起,这个特殊问题最终对我们的设置非常具体。

答案 1 :(得分:2)

可以从您描述的错误消息中

net start blah.blah.exe“服务名称无效。”

您在visual studio中添加的服务安装组件中提供服务的名称与您认为的不同。

开发人员错误地安装服务时,我已经遇到过这个问题了很多次。

答案 2 :(得分:1)

你想在服务开始时做些什么?

还要检查运行该服务的帐户,并且该帐户具有必要的权限。

答案 3 :(得分:1)

在编写我自己的服务时,我遇到过很多次这样的问题,所以我会列出一些在各个方面解决了我的问题并希望它们可以帮助你的事情:

  1. 我不得不重新启动services.msc,因为我已经卸载了一个它仍然认为有引用的服务。但是,当我开始时,“服务无效”

  2. 如果您是从控制台应用程序提供服务(以便可以调试它)但忘记将其更改回服务,则无法启动。

  3. 当我使用InstallUtil.exe时,有时它会尝试安装多个副本,所以我切换到只使用安装项目。

  4. 希望在某种程度上有所帮助。

答案 4 :(得分:0)

这是一个常见问题。你在Start活动中有什么代码?

您应该只有在服务启动时激活Timer的代码。这允许Start事件快速完成并通知控制器。如果执行时间超过此时间,您将收到错误。可能有某些原因(可能与数据有关)为什么它需要更长时间的生产。

当Timer定时器时,执行代码并停止定时器。显然,还将所有内容放在try / catch中并记录异常。

答案 5 :(得分:0)

时可能会发生此错误
  • 您的服务取决于其他服务/应用程序
  • 或由于app.config配置无效

由于缺少权限,当Entity Framework无法连接到数据库服务器时遇到相同的问题。 最好在应用程序中添加全局级错误日志记录机制,以便轻松调试问题。在某些情况下,事件查看器可能无法显示确切的详细信息。