【问题标题】:What is the proper way for a Windows service to fail during its startupWindows服务在启动期间失败的正确方法是什么
【发布时间】:2013-04-03 18:03:48
【问题描述】:

我需要我的服务在启动过程中检查某些文件的存在和结构,如果不满足某些条件则退出/失败/停止。 我读了这个帖子:What is the proper way for a Windows service to fail? 但这无济于事。

我将 ServiceBase.ExitCode 属性设置为非零,然后调用 ServiceBase.Stop。但我得到 5 个事件日志条目。见下文:

Starting service. (I log this event via code)
Config.xml file not found. (I log this ERROR event via code)
Service stopped successfully. (SCM logs this message)
Service started successfully. (SCM logs this message)
Service cannot be started. The handle is invalid  (SCM logs this message)

如您所见,除了最后两个条目外,一切正常。他们为什么在那里?如何在启动期间正确关闭服务?为什么 SCM 看不到服务已停止/失败?

【问题讨论】:

  • 我发现抛出异常而不是调用 Stop() 会阻止调用 OnStop 事件,并且我怀疑不会记录您看到的“成功停止”消息。到目前为止,我唯一能找到的似乎是可能的退出代码列表的是hiteksoftware.com/mize/Knowledge/articles/049.htm。如果我使用不在列表中的退出代码,我会收到类似"Error 10501: 0x2905" 的消息(x2905 = 十六进制值 10501)。是否没有关于退出代码的 MSDN 文档,或关于如何向用户发出如何调试问题的信号的指导?

标签: c# service windows-services


【解决方案1】:

您没有提供足够的代码来真正了解,但我怀疑您正在尝试验证服务并在构造函数或 OnStart 中停止它。我喜欢处理服​​务的方式是在 OnStart 中启动我的计时器。在计时器的第一个间隔中,我可以验证所有代码,如果它无效关闭服务。如果它有效,请将计时器的间隔重置为我希望它运行的频率,然后设置一个布尔值,告诉它不要再次检查文件的有效性。

【讨论】:

    【解决方案2】:

    您为ExitCode 使用的返回码是什么?如果它与对应的窗口ExitCode 匹配,那么这就是SCM 将记录的内容。我假设您为 ExitCode 返回 6。

    另一件事是,如果您可以在默认值上运行,请让 Config.xml 丢失,并将问题记录在 EventLog 中。 “配置文件丢失”

    如果您真的希望它在 OnStart 期间中止,请设置您的 ExitCode,然后抛出异常(例如,InvalidArgumentExceptionInvalidOperationException

    这篇文章也有一些很好的建议。 .NET: Which Exception to Throw When a Required Configuration Setting is Missing?

    【讨论】:

      【解决方案3】:

      您正在尝试启动第二个服务实例(为同一 .exe 注册的另一个服务)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-15
        • 2010-12-06
        • 1970-01-01
        • 2011-08-01
        • 2017-08-08
        • 1970-01-01
        相关资源
        最近更新 更多