问题 .NET Windows服务的奇怪问题


我有两个用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服务无法启动: 该服务没有及时响应启动或控制请求。“

编辑:已解决 该问题最终是一个配置错误和隐藏它的错误的组合。看我的 回答 下面了解更多详情。


9997
2017-07-27 17:54


起源

是否在生产系统上安装了正确的.NET版本? - Matt Davis
@Matt是的,这个.NET 3.5,它在生产盒上。 - Rob Cooke
只是在黑暗中拍摄:默认情况下,在Program.cs文件中检查Main方法。您说您已将日志记录添加到服务类的构造函数中,但它似乎没有被调用。我将日志记录添加到Main方法的开头,以检查是否会被调用。也许在那里添加了一些初始化代码,并且在生产环境中无法正确运行。 - Dr. Wily's Apprentice
了解。不是试图在这里击败死马,但我有一个基于.NET的Windows服务,每次都不能在目标系统上运行。在每种情况下,问题都是由于该系统上的.NET Framework未正确安装或缺少服务包。验证目标系统上的.NET Framework是否与测试系统上的.NET Framework匹配。如果您在测试系统上安装了.NET 2.0 / 3.0 / 3.5 Service Pack,请确保它们位于生产系统上。在一种情况下,重新安装.NET Framework为我们解决了问题。 - Matt Davis
为了澄清/添加Matt所说的,.NET 3.5和.NET 3.5 SP1之间存在很大差异。您可能在生产计算机上有3.5,但您的代码可能需要SP1。 - Jay


答案:


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

弄清楚了。

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

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

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

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

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


8
2017-07-28 18:24



我想我在这里遇到同样的问题。我会检查一下。谢谢 - apacay


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

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

您在Visual Studio中添加的服务安装组件中提供服务的名称不是您认为的那样。

开发人员在安装过程中误解了服务,我已经遇到过这个问题了好几次。


2
2017-07-28 14:57





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

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


1
2017-07-28 14:53





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

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

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

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

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


1
2017-07-28 15:41





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

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

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


0
2017-07-28 09:28



感谢您的回复,但这个问题比这更复杂。执行实际上是在服务的构造函数中死亡。请参阅我对OP的最新评论。 - Rob Cooke
你可以试试!SourceExists(mySourceName)?将InitializeComponent之后的所有内容放在try / catch中?我不明白为什么它不应该开始。 - Zesty


当发生此错误时,可能会发生此错误

  • 您的服务取决于其他服务/应用程序
  • 或者由于app.config配置无效

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


0
2017-11-15 13:43