C#ClickOnce部署Windows服务?

时间:2010-10-18 23:44:21

标签: c# windows-services clickonce

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

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

5 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

我有一个我们在这里工作的系统,似乎与服务相当好。我们部署的系统在任何给定时间都有大约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节点,更新,测试,打开关闭其他节点,更新,测试并重新打开第2个节点。您可以使用简单的脚本完成所有这些操作。这可能是一个比你需要的更复杂的系统,但如果你不能让服务离线进行简单的重启需要5秒钟,那么你真的需要一些系统来处理硬件问题,因为我可以保证它最终会发生。

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:1)

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

有关详细信息,请参阅http://support.microsoft.com/kb/816169