代码之家  ›  专栏  ›  技术社区  ›  Rob Cooke

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

  •  11
  • Rob Cooke  · 技术社区  · 15 年前

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

    这两个服务都是在Windows7VM上进行开发测试的,并且在WindowsServer2008 VM上进行了质量保证测试。这两个服务都在这些测试环境下安装和卸载了多次,但在生产环境(Windows Server 2008)中安装后,两个服务中的一个拒绝启动。

    要安装服务,我们将使用InstallUtil.exe,并将ServiceInstaller和ServiceProcessInstaller组件附加到该服务。

    显然,失败的服务安装成功。InstallUtil.exe报告成功,服务显示在服务管理单元中。您也可以在注册表中的hkey_local_machine\system\currentcontrolset\services\blah blah下找到该服务。但是,如果尝试启动服务,则会得到以下信息:

    net启动blah.blah.exe “服务名无效。”

    …或者浏览服务管理单元… Windows无法启动本地计算机上的“blah blah”服务。错误1053:服务没有及时响应启动或控制请求。“

    我已经向服务类failing service的构造函数添加了一些事件日志记录,但它似乎没有被调用。

    由于这是一个生产框,因此框中没有Visual Studio,因此远程调试是不可能的。

    有没有其他方法可以让我获得有关失败服务为什么不启动的调试信息?

    有没有其他明显的理由让我看到这种问题?

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

    “等待blah blah服务连接时超时(30000毫秒)。

    “由于以下错误,blah blah服务无法启动: 服务没有及时响应启动或控制请求。”

    编辑:解决 这个问题最终是一个配置错误和隐藏错误的组合。看到我 answer 详情请参见下文。

    6 回复  |  直到 7 年前
        1
  •  8
  •   Rob Cooke    15 年前

    危险答案:“无效的自定义配置和错误的全局异常处理程序如何在.NET Windows服务中显示自己?”

    算了出来。

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

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

    第二个异常没有被记录到任何地方,我们只是通过代码检查发现的。

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

    谢谢大家的帮助!很抱歉,这个特定的问题最终只针对我们的设置。

        2
  •  2
  •   msarchet    15 年前

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

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

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

    我有过很多次这样的问题,开发人员在安装时错误地命名了服务。

        3
  •  1
  •   ajay_whiz    15 年前

    在服务启动时,您打算做什么?

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

        4
  •  1
  •   Brandi    15 年前

    我在为自己的服务编程时遇到过很多这样的问题,所以我将列出一系列在各个方面解决了我的问题并希望它们能帮助您:

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

    2. 如果您是从控制台应用程序生成服务(以便可以对其进行调试),但忘记将其更改回服务,那么它将不会启动。

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

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

        5
  •  0
  •   Zesty    15 年前

    这是一个共同的问题。您在开始活动中有什么代码?

    您应该只有在服务启动时激活计时器的代码。这允许启动事件快速完成并通知控制器。如果执行时间比这长,您将得到收到的错误。可能有一些原因(可能与数据有关)导致它在生产中花费更长时间。

    当计时器滴答作响时,执行代码并停止计时器。显然,还要将所有内容放入try/catch并记录异常。

        6
  •  0
  •   Deshan    7 年前

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

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