【问题标题】:C# ClickOnce deployment for Windows Services?用于 Windows 服务的 C# ClickOnce 部署?
【发布时间】:2010-10-18 23:44:20
【问题描述】:

部署必须更新的 Windows 服务有哪些最佳做法?

我有一个要部署的 Windows 服务,但在测试过程中可能需要一些调试和新版本。处理它的最佳方法是什么?理想情况下,我想为 Windows 服务找到 ClickOnce 风格的部署解决方案,但我的理解是这不存在。对于 Windows 服务,我最接近 ClickOnce 的位置是什么?

【问题讨论】:

标签: c# windows-services clickonce


【解决方案1】:

我使用的一个简单解决方案是仅停止服务并将文件从我的 bin 文件夹复制到服务文件夹中。

停止服务然后复制文件的批处理文件应该很容易放在一起。

Net stop myService
xcopy \\myServerWithFiles\*.* c:\WhereverTheServiceFilesAre
net start myService

【讨论】:

  • 我喜欢这个,又快又简单!
  • 嘿,我喜欢这个。调试时我基本上是手动做同样的事情。
【解决方案2】:

我有一个我们在这里工作时使用的系统,它似乎与服务配合得很好。我们部署的系统在任何给定时间都有大约 20-30 个服务。在工作中,我们使用名为 TopShelf 的产品,您可以在这里找到它http://topshelf-project.com/

基本上,TopShelf 处理了很多与服务相关的事情。从服务的 cmd 行安装、卸载等。非常有用的功能之一是能够作为控制台运行以进行调试。您构建一个服务,并使用不同的 cmd 行启动,您可以将其作为控制台运行以查看服务的输出。我们向该软件添加了一项自定义功能,可让我们提前配置配置文件。基本上,我们的配置文件配置了一些东西,比如日志记录、资源位置等,这样我们就可以控制所有这些,而无需重新发布任何代码。我们所做的就是运行类似

的命令

D:\Services\ServiceName.exe Core.Profiles.Debug 或
D:\Services\ServiceName.exe Core.Profiles.Production

获取不同的日志记录配置。

我们的构建脚本为我们的每个服务创建 install.cmd 和 uninstall.cmd 脚本,我们所做的只是将文件复制到服务器并运行脚本。如果我们想查看调试输出,我们会停止服务并双击 exe,然后我们会得到一个控制台来读取所有输出。

topshelf 还有一个我们不使用的东西,因为它不是必需的,那就是搁架的概念(本网站上有相关文档)。这使您无需“重新启动”即可更新服务,但您仍然需要手动复制文件,除非您为此构建了一个自动化系统。

但是,如果您需要 100% 的服务可用性,我的建议是拥有一个冗余系统。无论您如何配置更新服务,如果没有自动故障转移系统,您都无法避免硬件故障导致停机。如果所述系统到位,我推荐的更新策略是关闭 1 个节点,更新,测试,打开关闭另一个节点,更新,测试并重新打开第二个节点。当然,您可以使用一个简单的脚本来完成这一切。这可能是一个比您需要的更复杂的系统,但如果您无法让服务脱机以进行需要 5 秒的简单重启,那么您确实需要一些系统来处理硬件问题,因为我可以保证它最终会发生。

【讨论】:

    【解决方案3】:

    由于服务是长期运行的,因此使用 ClickOnce 样式部署可能不可行 - 因为 ClickOnce 仅在您启动应用程序时更新。服务通常只会在机器重新启动时启动。

    如果您需要自动更新服务,那么最好的办法可能是将某些内容手动编码到服务中,但我认为几乎所有解决方案都会出现问题:大多数安装过程都需要一定程度的用户交互(如果只是绕过 UAC),所以我无法想象这会导致一个不涉及在某些时候让登录用户出现在屏幕前的答案。

    一个可行的想法是活动目录部署(或类似的等价物)。如果您的服务是通过标准 MSI 类型的安装程序部署的,AD 允许您在计算机策略中静默更新应用程序。我怀疑您必须强制服务器刷新 AD 策略(通过重新启动或从控制台使用 gpupdate),但除此之外,它应该是不干涉部署。

    【讨论】:

      【解决方案4】:

      我建议对此使用“插件”方法,即使用Proxy Design Pattern。

      使用此模式时,独立线程可能会验证文件夹以进行更新。您将需要在您的程序集部署中使用ShadowCopy。当您的服务更新线程遇到您的服务的新版本时,它将卸载当前的生产程序集并加载新版本,而不会停止服务本身。更!如果您的程序集中没有破坏代码,您的服务永远不会注意到差异。

      【讨论】:

      【解决方案5】:

      我建议创建一个普通的安装项目,并在该安装项目中添加 Windows 服务项目输出。

      更多信息请参考http://support.microsoft.com/kb/816169。

      【讨论】:

        猜你喜欢
        • 2010-10-02
        • 1970-01-01
        • 1970-01-01
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多