使用 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 3.0迁移到Wix 4.0时出现错误:WXCP0006:此节点前的空格不正确(WhitespacePrecedingNodeWrong)