我有一个Windows服务,它在NServiceBus.Host.exe中托管一个NServiceBus端点。
二进制文件部署到服务器上的c:\inetpub\bus\services\myService
文件夹中。
DSC脚本确保在服务器上创建/存在Windows服务,并使用"可执行文件"服务的属性设置为"c:\inetpub\bus\services\myService´NServiceBus.Host.exe" -service NServicebus.Production
。
注意!使用内置-service
参数安装服务时添加了NServiceBus.Host.exe /install
开关,这就是我将其添加到Windows服务可执行文件路径的原因在DSC脚本中。
现在,当我尝试在服务器上手动启动服务时,会产生以下错误消息
Windows could not start the <service name> service on the Local Computer.
Error 1053: The service did not respond to the start or control request in a timely fashion.
我查看了事件日志,并发出以下两条错误消息:
NServiceBust.Host.exe错误:
Application: NServiceBus.Host.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info:
Topshelf.Exceptions.ConfigurationException
at Topshelf.Internal.Actions.RunAsServiceAction.Do(Topshelf.Configuration.IRunConfiguration)
at Topshelf.Runner.Host(Topshelf.Configuration.IRunConfiguration, System.String[])
at NServiceBus.Host.Program.Main(System.String[])
本地激活权限错误:
The application-specific permission settings do not grant Local
Activation permission for the COM Server application with CLSID
{D63B10C5-BB46-4990-A94F-E40B9D520160}
and APPID
{9CA88EE3-ACB7-47C8-AFC4-AB702511C276}
to the user <my_service_account_user> SID (<service_account_SID>) from
address LocalHost (Using LRPC) running in the application container
Unavailable SID (Unavailable). This security permission can be modified
using the Component Services administrative tool.`
注意!上述错误只发生一次,即我第一次尝试启动该服务。对于任何后续尝试启动服务,它不会再出现在事件日志中。
到目前为止我做了什么:
NServiceBus.Host.exe /install
参数安装服务。在这种情况下,将使用以下格式创建服务名称:MyService.EndpointConfig_v1.0.0.0
。使用此方法,服务成功启动,没有任何错误消息
dcomcnfg
c:\inetpub\bus\services\myService´NServiceBus.Host.exe NServicebus.Production
=&gt;成功我的Init()
服务方法如下所示:
namespace MyService
{
public class EndpointConfig : IConfigureThisEndpoint, AsA_Server, IWantCustomLogging, IWantCustomInitialization
{
public void Init()
{
Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);
SetLoggingLibrary.Log4Net(() => XmlConfigurator.Configure(File.OpenRead(@"log4net.config")));
GlobalContext.Properties["Hostname"] = Dns.GetHostName();
GlobalContext.Properties["Service"] = typeof(EndpointConfig).Namespace;
var container = new WindsorContainer(new XmlInterpreter());
Configure.With()
.CastleWindsorBuilder(container)
.XmlSerializer()
.MsmqTransport()
.IsTransactional(true)
.PurgeOnStartup(false)
.IsolationLevel(System.Transactions.IsolationLevel.RepeatableRead);
var connectionString = ConfigurationManager.ConnectionStrings["<some_conn_string>"].ConnectionString;
container.Register(
Component.For<IDatabaseProvider>()
.ImplementedBy<DatabaseProvider>()
.DependsOn(Property.ForKey("connectionString").Eq(connectionString)));
}
}
}
使用/install
安装服务时我假设NServiceBus.Host.exe在引擎盖下做了一些黑魔法 - 例如授予一些必要的权限 - 使服务能够启动。
注意!在服务器上,安装了最新版本的NServiceBus(v6.x)。但是,在我的解决方案/服务项目中使用了2.x版(请不要问我是否可以升级 - 不幸的是,这不是一个选项)。
感谢我能得到的任何帮助,因为我的想法已经不多了。
有人问我为什么不能使用NServiceBus的/install
参数并对此感到满意。答案就是我可以(实际上,我现在是)。
我仍然发布此问题的原因是拆分:
/install
参数并不十分满意。原因?它归结为鸡肉或鸡蛋&#34;问题。我使用Powershell DSC在Azure中配置服务器,我相信确保服务器上存在Windows服务是DSC的责任。但是,第一次配置服务器时,除非我使用DSC编写创建脚本,否则服务不能存在,并指向可执行路径,以便在发生这种情况时部署服务二进制文件。另一种方法是跳过DSC中的服务创建,并将NServiceBus.Host.exe /install
作为服务/应用程序部署脚本的一部分运行。显然,只有在配置服务器之后才能进行部署。因此,它需要将DSC脚本的Windows服务部分剥离到例如仅确保服务存在 - 在第一次部署应用程序之前,验证将失败。