2010-10-18 137 views
7

能够部署必须更新的Windows服务的一些最佳实践是什么?针对Windows服务的C#ClickOnce部署?

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

+0

另见http://stackoverflow.com/questions/4002462/how-can-i-write-a-java-application-that-c​​an-update-itself-at-runtime/4002465#4002465 – 2010-10-28 06:15:54

回答

7

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

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

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

我喜欢这个,快速简单! – Lukasz 2010-10-25 19:27:59

+0

嘿,我喜欢这个。我基本上在调试时手工做同样的事情。 – nportelli 2010-10-29 12:06:21

2

由于服务是无论如何长时间运行,使用ClickOnce部署的风格可能是不可行的 - 因为只有ClickOnce的更新,当你启动应用程序。服务通常只会在机器重新启动时启动。

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

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

3

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

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

+0

+1。类似于这个问题的答案:http://stackoverflow.com/questions/4002462/how-can-i-write-a-java-application-that-c​​an-up-date-itself-at-runtime/4002465#4002465 – 2010-10-28 06:15:25

3

我有一个系统,我们在这里工作,似乎很好地与服务功能。我们部署的系统在任何时候都有大约20-30个服务。在工作中,我们使用一个名为TopShelf你可以在这里找到它http://topshelf-project.com/

基本上TopShelf处理大量的业务相关的东西的产品。从服务的cmd行安装,卸载等。其中一个非常有用的功能是作为调试控制台运行的能力。您创建一个服务,并使用不同的cmd行开始,您可以将其作为控制台运行以查看服务的输出。我们在该软件中添加了一项自定义功能,可让我们提前配置配置文件。基本上我们的配置文件配置了一些东西,如日志记录,资源位置等,以便我们可以控制所有这些,而无需重新发布任何代码。我们所要做的就是运行一个命令像

d:\ SERVICES \ ServiceName.exe Core.Profiles.Debug
d:\ SERVICES \ ServiceName.exe Core.Profiles。生产

获得不同的日志配置。

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

还有一件事我们没有使用,因为它没有必要是顶棚的概念(这里有关于这个网站的文档)。这使您可以更新服务而无需“重新启动”,但您仍然需要手动复制文件,除非您为此创建自动化系统。

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