我们已经开发了一个Windows服务,以向客户端应用程序提供数据,并且一切都非常顺利。客户提出了一个有趣的配置请求,需要在同一台服务器上运行两个该服务的实例,并配置为分别指向不同的数据库。
到目前为止,我还没有成功实现这个需求,希望我的StackOverflow网友们能够给一些提示。
当前设置:
我已经设置了包含Windows服务的项目,我们从现在起将其称为AppService,以及ProjectInstaller.cs文件,该文件处理自定义安装步骤,根据App.config中的关键字设置服务名称,如下所示:
this.serviceInstaller1.ServiceName = Util.ServiceName;
this.serviceInstaller1.DisplayName = Util.ServiceName;
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
在这种情况下,Util只是一个静态类,从配置文件中加载服务名称。从这里开始,我尝试了两种不同的方法来安装两个服务,但都以相同的方式失败。
第一种方法是简单地安装第一个服务副本,复制已安装的目录并将其重命名,然后在修改应用程序配置以更改所需服务名称后运行以下命令:
InstallUtil.exe /i AppService.exe
当我尝试使用第一个安装程序无法成功后,我尝试创建了第二个安装程序,编辑了配置文件并构建了第二个安装程序。当我运行安装程序时,它可以正常工作,但服务未显示在services.msc中,所以我针对第二个已安装的代码库运行了先前的命令。
两次都收到了以下来自InstallUtil的输出(仅包含相关部分):
正在运行事务安装。
开始安装过程。
正在安装服务App Service Two... 服务App Service Two已成功安装。 在应用程序日志中创建EventLog源App Service Two...
在安装阶段发生异常。 System.NullReferenceException:对象引用未设置为对象的实例。
还原应用程序日志以恢复源App Service Two的之前状态。 正在从系统中删除服务App Service Two... 服务App Service Two已成功从系统中删除。
回滚阶段已成功完成。
事务安装已完成。 安装失败,并执行了回滚操作。
很抱歉我的帖子有点长,我想确保提供了足够的相关信息。目前让我感到困惑的是,它表示服务的安装已成功完成,只有在尝试创建EventLog源后似乎才会引发NullReferenceException。因此,如果有人知道我做错了什么或有更好的方法,将不胜感激。
http://journalofasoftwaredev.wordpress.com/2008/07/16/multiple-instances-of-same-windows-service/
。你可以在安装程序中插入代码,在运行installutil时获取所需的服务名称。 - Vivian River