使用 WiX 将 NServiceBus.Host 安装为服务

Posted

技术标签:

【中文标题】使用 WiX 将 NServiceBus.Host 安装为服务【英文标题】:Install NServiceBus.Host as service using WiX 【发布时间】:2013-08-19 04:07:38 【问题描述】:

我正在使用 WiX 为我们基于 NServiceBus 的解决方案创建安装程序,但在安装后无法启动主机服务。

如果我从命令行使用NServiceBus.Host.exe /install 运行主机的安装程序,它可以正常安装,甚至在我启动服务时启动成功。

但是,当我在 WiX 中使用 ServiceInstall 元素创建服务时,它无法启动服务。我尝试使用ServiceControl 元素在我的安装程序中启动该服务,并从 WIndows 服务控制面板进行安装后。

我试图在 WiX 中使用的代码是:

<Component Id="NServiceBus.Host" Guid="PUT-GUID-HERE" Win64="yes">
  <File Id="NServiceBus.Host" KeyPath="yes"
      Source="$(var.[Project].TargetDir)NServiceBus.Host.exe" Checksum="yes" />
  <ServiceInstall Id="NServiceBus.Host.Install"
      Name="[Product].Host" DisplayName="[Product]" Type="ownProcess"
      Account="NT Authority\Network Service" Interactive="no" Start="auto"
      Vital="yes" ErrorControl="normal">
    <ServiceDependency Id="MSMQ" />
    <ServiceDependency Id="MSDTC" />
  </ServiceInstall>
  <ServiceControl Id="NServiceBus.Host.Control" Name="[Product].Host"
      Start="install" Stop="both" Remove="uninstall" Wait="yes" />
</Component>

我在其他项目中使用相同的代码来安装和运行服务,所以我很确定问题与 NServiceBus 的主机有关。此处的服务也似乎安装正确,但无法运行。

有没有人能够使用 WiX 将NServiceBus.Host.exe 安装为服务?或者有谁知道当我运行 NServiceBus.Host.exe /install 时是否还有其他步骤发生在我的 WiX 安装程序中?

我知道我可以在运行 NServiceBus.Host.exe /install 的 WiX 中创建一个 CustomAction,但如果可能的话,我宁愿避免这样做,并以正确的 (WiX) 方式安装服务。它还避免了我需要考虑卸载操作和排序。

编辑:作为参考,这是我使用 WiX 的 MsmqExtension 创建队列的方式:

<Component Id="NServiceBus.Host.Queue" Guid="PUT-GUID-HERE" Win64="yes">
  <msmq:MessageQueue Id="Queue1" Label="[Product] Host"
      PathName=".\private$\[Product].Host"
      Transactional="yes" PrivLevel="optional" />
  <msmq:MessageQueue Id="Queue2" Label="[Product] Host Retries"
      PathName=".\private$\[Product].Host.Retries"
      Transactional="yes" PrivLevel="optional" />
  <msmq:MessageQueue Id="Queue3" Label="[Product] Host Timeouts"
      PathName=".\private$\[Product].Host.Timeouts"
      Transactional="yes" PrivLevel="optional" />
  <msmq:MessageQueue Id="Queue4" Label="[Product] Host Timeouts Dispatcher" 
      PathName=".\private$\[Product].Host.TimeoutsDispatcher"
      Transactional="yes" PrivLevel="optional" />
</Component>

【问题讨论】:

您能提供 NSB 日志和 app.config 吗? 【参考方案1】:

你快到了。您需要将NServiceBus.Host.exe 期望的命令行参数传递给ServiceInstall 标签上的Arguments 属性,例如

<ServiceInstall Id="NServiceBus.Host.Install"
     Name="[Product].Host" DisplayName="[Product]" Type="ownProcess"
     Account="NT Authority\Network Service" Interactive="no" Start="auto"
     Vital="yes" ErrorControl="normal"
     Arguments="-service NServiceBus.Production /serviceName:[Product].Host">

首先使用 NSB 主机安装您的服务,然后从 Windows 服务中查看所有命令行参数并将它们放入您的 WiX 安装程序。

编辑: 如果您不想运行自定义操作来让 NSB 在 WiX @ 安装时创建队列和/或做其他事情,您可以通过在代码中添加自定义 NSB profile 来实现类似的效果,例如

namespace YourNamespace

    public class YourProfile : NServiceBus.IProfile  

    public class YourProfileBehaviour : IHandleProfile<YourProfile>
        
        public void ProfileActivated()
        
            WindowsInstallerRunner.RunInstallers = true;
        
    

请记住,每次重新启动服务时,使用上述配置文件都会运行 NSB 安装程序代码(例如,检查并在必要时添加队列)。我想这两种方式都需要权衡取舍。

【讨论】:

这在技术上可行,但不会创建队列,这只是 NServiceBus 安装过程为您做的一件事。 谢谢。我会研究这个选项并报告。 我不关心创建队列,因为我可以在 WiX 中使用 MsmqExtension 做到这一点。我已经完成了那部分工作。 好吧,我试了一下,我唯一需要改变的是你的最后一个参数应该是-serviceName:[Product].Host。否则它似乎工作。我显然错过了-service 参数,但实际上是-serviceName 发挥了作用。 (并且 serviceName 参数必须与实际的服务名称完全匹配!)【参考方案2】:

您不应尝试在 WiX 中复制 NServiceBus 主机安装程序。有很多事情会发生,而且会随着每个版本的发布而改变,所以你尝试的任何东西都会非常脆弱。

您应该使用正确的命令行处理程序简单地执行主机,而不是 ServiceInstall 元素,并让 NServiceBus 自行处理。我对 WiX 不是很熟悉,但我认为有某种方法可以使用命令行参数执行任意可执行文件?

要明确

是的,可以使用 WiX 将 NServiceBus 端点安装为服务。我是说你不应该,不是说你不能。

如果您不使用 NServiceBus 安装程序来安装端点,您将错过队列生成和 NServiceBus 主机调用的其他任务,而 WiX(不知道 NServiceBus 的运行方式)无法执行。

【讨论】:

是的,这是可能的。但是,它在管理何时运行可执行文件以安装和卸载方面引入了更多复杂性。 WiX 的概念是描述系统所需的状态并让 Windows 实现它,而不是仅仅运行一个顺序脚本,您必须自己处理所有条件逻辑。我只是希望有办法以 正确 WiX/Windows Installer 方式安装 NServiceBus。 Rob Mensching 关于避免自定义操作的博客文章:robmensching.com/blog/posts/2007/8/17/… 我不同意这一点。一个windows服务就是一个windows服务就是一个windows服务。跟NSB没关系。 NSB 不使用 topshelf 将自身安装为服务吗?如果您谈论的是基础设施安装程序,那么我会同意。 NSB 更喜欢以特定方式配置的 MSMQ 和 DTC。 +1 我不认为这是一个坏建议。 NServiceBusHost.exe 拥有关于如何自行安装的专业知识 - 使用这些知识是明智的。正如@David Boike 指出的那样,如果 NServiceBusHost 改变了它的安装方式,那么您将自动获得这些更改,而维护开销为零。并不是说我一定同意这个答案,但其中有一些道理,不值得反对。 安装 NserviceBus 时,它会运行一些代码来执行启动操作。这些通常包括设置各种输入队列等。是的,可以使用 WiX,如@ChrisBednarski 的答案所示,通过传入 NSB 在运行时期望的命令行参数,但是你会丢失所有这些首次运行的操作。

以上是关于使用 WiX 将 NServiceBus.Host 安装为服务的主要内容,如果未能解决你的问题,请参考以下文章

将前端库导入 wix 网站

使用Wix将整个目录添加到MSI数据库的规范方法是什么?

将 Visual Studio 安装项目转换为 WIX

将Wix 3.0迁移到Wix 4.0时出现错误:WXCP0006:此节点前的空格不正确(WhitespacePrecedingNodeWrong)

使用 WIX 将不同的 IIS 应用程序池分配给 Web 服务

将 Windows SDK 引导程序包与 WiX 一起使用