使用WiX安装NServiceBus.Host-as-service
我正在使用WiX为基于NServiceBus的解决方案创建一个安装程序,但在安装后启动主机服务时遇到了问题 如果我使用使用WiX安装NServiceBus.Host-as-service,wix,nservicebus,Wix,Nservicebus,我正在使用WiX为基于NServiceBus的解决方案创建一个安装程序,但在安装后启动主机服务时遇到了问题 如果我使用NServiceBus.host.exe/install从命令行运行主机的安装程序,它将正常安装,甚至在我启动服务时成功启动 但是,当我在WiX中使用ServiceInstall元素创建服务时,它无法启动服务。我已尝试在安装程序中使用ServiceControl元素启动该服务,以及从WIndows服务控制面板进行后期安装 我试图在WiX中使用的代码是: <Component
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>
您不应该尝试在WiX中复制NServiceBus主机安装程序。有很多事情会发生,每一次发布都会发生变化,所以任何你想尝试的事情都会变得非常脆弱 您不应该使用ServiceInstall元素,而应该使用正确的命令行处理程序执行主机,并让NServiceBus自行处理。我不太熟悉WiX,但我假设有某种方法可以使用命令行args执行任意可执行文件 要清楚 是的,可以使用WiX将NServiceBus端点作为服务安装。我是说你不应该,不是说你不能
如果不使用NServiceBus安装程序安装端点,您将错过队列生成和其他NServiceBus主机调用WiX(不知道NServiceBus如何操作)无法完成的任务。您就快完成了。您需要将
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@installation time中创建队列和/或做其他事情,您可以通过在代码中添加自定义NSB来实现类似的效果,例如
namespace YourNamespace
{
public class YourProfile : NServiceBus.IProfile { }
public class YourProfileBehaviour : IHandleProfile<YourProfile>
{
public void ProfileActivated()
{
WindowsInstallerRunner.RunInstallers = true;
}
}
}
名称空间
{
公共类YourProfile:NServiceBus.IProfile{}
公共类YourProfile行为:IHandleProfile
{
已激活的公共文件()
{
WindowsInstallerRunner.RunInstallers=true;
}
}
}
请记住,每次重新启动服务时,使用上述配置文件都会运行NSB安装程序代码(如有必要,请检查并添加队列)。我想这两种方法都有利弊。你能提供NSB日志和app.config吗?是的,这是可能的。但是,它在管理何时运行可执行文件以进行安装和卸载时引入了更多的复杂性。WiX的概念是描述系统的期望状态,并让Windows来实现,而不是只运行一个顺序脚本,您必须自己处理所有的条件逻辑。我只是希望有一种方法可以以正确的WiX/Windows安装程序方式安装NServiceBus。Rob Mensching关于避免自定义操作的博客文章:我不同意这一点。windows服务是windows服务是windows服务。这与国家安全局无关。NSB不使用topshelf将自己作为服务安装吗?如果你说的是基础设施安装人员,那么我同意。NSB更喜欢以特定方式配置MSMQ和DTC。+1我不认为这是一个坏建议NServiceBusHost.exe
拥有如何自我安装的专业知识-使用这些知识是明智的。正如@David Boike所指出的,如果NServiceBusHost改变了它的安装方式,您可以自动获得这些更改,而维护开销为零。并不是说我一定同意这个答案,但其中有一些道理,不值得否决。当NserviceBus安装时,它会运行一些代码来执行启动操作。这些通常包括设置各种输入队列等。是的,如@ChrisBednarski的回答所示,可以使用WiX,方法是传入NSB在运行时期望的命令行参数,但是您会丢失所有第一次运行的操作。从技术上讲,这是可行的,但不会创建队列,这只是NServiceBus安装过程为您做的一件事。谢谢。我将研究此选项并报告。我不关心创建队列,因为我可以在WiX中使用MsmqExtension来创建队列。我已经让那个部件工作了。好吧,我试了一下,唯一需要更改的是您的上一个arugument应该是-serviceName:[Product].Host
。否则,它似乎会起作用。很明显,我遗漏了-service
参数,但真正起作用的是-serviceName
。(serviceName参数必须与实际服务名称完全匹配!)
namespace YourNamespace
{
public class YourProfile : NServiceBus.IProfile { }
public class YourProfileBehaviour : IHandleProfile<YourProfile>
{
public void ProfileActivated()
{
WindowsInstallerRunner.RunInstallers = true;
}
}
}