2009-07-07 92 views
14

我即将开发一个程序,该程序将作为Windows服务在多个客户端的后端服务器(具有互联网访问)上安装和运行。我没有物理访问服务器。我正在努力的是可靠地推出更新程序的方案。自动更新Windows服务

我花了相当多的时间寻找Windows Service自动更新的最佳实践,但发现了很少有用的信息。大多数技术(如ClickOnce)似乎主要针对基于Windows Forms的应用程序。

我目前的计划是:

  • 有更新可用时,有正在运行的服务下载,安装并启动更新服务。
  • 更新服务将下载新版本的主要服务,并将其并行安装在当前仍然有效的版本中。
  • 更新服务接下来停止旧版本,然后启动新版本的服务。
  • 新版本在启动过程中禁用更新服务。

我一些重要的担忧是:

  • 能够处理既可以更新到主业务和更新服务
  • 能够处理中断,如电源故障或连接失败更新过程中的任何一点

有什么想知道的是,如果这是解决这个问题的常用方法和/或如果我错过了任何关键的东西。它太复杂了,还是太简单了?你会怎么做(或者更好,你是如何成功完成的)?

谢谢!

回答

13

去年我面临同样的问题,我也遇到了很多相同的问题。建议的几个位:

  • 由于任一服务可能会更新, 这两种服务将作为其他的 更新程序。服务A将 更新服务B,反之亦然。对于 这个原因,我建议在任何时候都简单地运行 两种服务。除非 您真的很担心 下降您的服务器与 确实更新存在调用, 启用/禁用服务管理 是不值得的开销。

  • 就像服务不能安装在一台 单机上。换句话说,你 不能安装 并行服务的新旧版本,如果他们有 相同的名称。除非您想让 更新过程变得复杂,否则我建议您卸载旧版本 ,然后安装新版本。 例如,服务A将下载 服务B安装程序,卸载 服务B,安装新版本 服务B,然后运行。服务B 会做同样的服务A.

  • 由于每个服务管理 另一方面,他们不仅要检查 可用更新,但他们应该 核实对方的健康。例如,对于 示例,如果服务B存在并且它运行的是 ,则服务A将检查看 。如果健康检查失败, 一所列步骤来解决问题 并获得服务运行将 完成了服务A.执行的 健康检查和恢复操作 将覆盖你现在无论什么问题 出现与更新,初始的 安装或一般操作。

  • 在客户端 和服务器上都做了充足的日志记录。您需要跟踪 采取了何种行动和何时采取了行动。 例如,服务A可能会在 正在检查更新,当它执行健康检查的 和 关联的操作。在服务 (假设您打电话到网络 服务寻找更新)跟踪 每个服务的调用。如果 你的服务没有得到更新 至少你会有 痕迹痕迹(或缺少面包屑) 指出你的问题。

从字面上有蕉潜在的陷阱与这种解决方案:在启动时不运行的服务,UAC的方式获得,不能够使用相同的用户安装和卸载服务,确保用户在安装该服务具有足够的权限,连接丢失,在客户端计算机上安装.NET Framework,在必要时安装后处理重新启动等。

祝您好运。这是一个有趣的问题需要解决,但如果没有挫折感,这种问题就不会发生 - 尤其是因为,正如你所说的那样,没有很多可用的文件资料。

+0

感谢您的宝贵意见。您是如何处理在旧版本被卸载之后但在新版本安装之前更新过程中断的潜在情况?你有没有跟踪你在这个过程中有多远? – 2009-07-07 21:24:00