【问题标题】:WinService sometimes fails to start after bootWinService 有时启动后无法启动
【发布时间】:2013-06-01 03:17:13
【问题描述】:

我有一些 Windows 服务(全部用 C# 编写)都表现出相同的奇怪行为。 我将它们设置为延迟自动启动,以便它们在启动后启动(延迟,因为它们并不重要)。 它们都将 WCF 服务作为客户端-服务器应用程序的一部分托管,并且如果重要的话,它们都是使用 WiX 安装的。

我注意到有时他们只是不启动。 如果您在操作系统准备就绪后足够快地查看“服务”窗口,它们的状态为“正在启动”。如果您随后刷新视图,它们将不再启动,但也不会“启动”。 然后,您可以手动启动它们而不会出现任何问题。

这不会产生错误消息和日志条目。为了让它变得更好,只有在机器关闭并再次打开时才会发生这种情况。每次重启都能正常工作(在两台不同的机器上尝试了大约 20 次)

如果您将失败操作设置为在失败后重新启动服务,它似乎最终会成功启动服务,但这肯定不是理想的解决方案。

操作系统是 Windows 7 和 WinServer 2008 R2

我在这里缺少什么?为什么它们无法自动启动(至少第一次)?为什么计算机在重新启动或关机后启动会有所不同?

编辑: 我对失败的行动是错误的。没有解决问题。

编辑 2: 我在所有内容中添加了异常处理以记录可能的异常。但到目前为止,没有记录任何异常。

【问题讨论】:

标签: c# wcf windows-services wix boot


【解决方案1】:

可能是 WCF 服务需要很长时间才能启动? afaik,Windows服务必须在一定时间内出现(最佳做法是30秒,我不知道技术限制)才能不超时。这可以解释为什么您的服务处于“正在启动”状态但没有启动。

【讨论】:

  • 那你怎么解释如果我手动启动服务确实成功启动(几乎立即)?
  • 可能您的 WCF 服务的任何依赖项在系统启动时都没有准备好?
  • 如果是依赖问题,应该抛出异常。还是不是这样?
  • 有依赖关系 我考虑到对其他服务的依赖关系,比如在启动时可能还没有准备好的数据库服务。如果缺少程序集依赖项,就会出现异常,是的。
  • 那么如果服务依赖不满足就不会抛出异常?
【解决方案2】:

请从副本中查看我的答案。出于安全原因,Windows 服务通常不应访问桌面。但它肯定应该有大量的登录。你可能有竞争条件。在 WiX 中你唯一能做的就是表达对另一个服务的依赖,让服务控制管理器在启动服务之前等待一段时间。但是,如果您的代码更健壮,那确实会更好。一个例子是 OnStart 事件启动一个后台工作进程,然后返回成功。然后后台线程可以继续尝试托管 WCF 端点,并且所有内容都会在进程中进行大量日志记录。

【讨论】:

  • 如果我的代码尝试访问应该由另一个尚未启动的服务提供的内容,会不会引发异常?
  • 不看代码就不确定如何回答。放入一个 try catch 并记录它。这有点像一个老问题“如果一棵树倒在森林里而周围没有人听到它,它会发出声音吗?”
  • 但是默认情况下不是自动记录异常吗?
  • 应该是,如果您没有捕捉到它们并且知道在事件查看器中查看的位置。不是IMO的想法故事。 stackoverflow.com/questions/711032/…
  • 现在我添加了尝试和捕获所有内容并记录异常。但没有发生异常,因此没有记录任何内容。
猜你喜欢
  • 1970-01-01
  • 2014-06-21
  • 2013-04-21
  • 2020-05-11
  • 1970-01-01
  • 2012-09-12
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多