无法启动NServiceBus Windows服务

时间:2017-07-27 17:26:22

标签: c# windows windows-services nservicebus

问题描述

我有一个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.`

注意!上述错误只发生一次,即我第一次尝试启动该服务。对于任何后续尝试启动服务,它不会再出现在事件日志中。

到目前为止我做了什么:

  1. 尝试了a closely related post here on SO中的建议,其中没有一项是有效的。
  2. 尝试使用NServiceBus.Host.exe /install参数安装服务。在这种情况下,将使用以下格式创建服务名称:MyService.EndpointConfig_v1.0.0.0。使用此方法,服务成功启动,没有任何错误消息
    • 停止服务,然后尝试启动DSC脚本创建的服务(使用其他名称)=&gt;成功
    • 删除NServiceBus创建的服务,然后再次尝试启动DSC创建的服务=&gt;失败
  3. 尝试在运行服务时授予用于登录的服务帐户各种权限(两者都没有取得任何成功),其中包括:
    • 管理员组中的成员身份
    • “性能日志用户”组中的成员身份
    • 完整的DCOM权限,通过&#34;启动和激活权限&#34;在dcomcnfg
  4. 尝试从CLI运行c:\inetpub\bus\services\myService´NServiceBus.Host.exe NServicebus.Production =&gt;成功
  5. 代码

    我的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版(请不要问我是否可以升级 - 不幸的是,这不是一个选项)。

    感谢我能得到的任何帮助,因为我的想法已经不多了。

    编辑1

    有人问我为什么不能使用NServiceBus的/install参数并对此感到满意。答案就是我可以(实际上,我现在是)。

    我仍然发布此问题的原因是拆分:

    1. 我希望了解为什么两种看似等效的方法中的一种失败
    2. 我对使用/install参数并不十分满意。原因?它归结为鸡肉或鸡蛋&#34;问题。我使用Powershell DSC在Azure中配置服务器,我相信确保服务器上存在Windows服务是DSC的责任。但是,第一次配置服务器时,除非我使用DSC编写创建脚本,否则服务不能存在,并指向可执行路径,以便在发生这种情况时部署服务二进制文件。另一种方法是跳过DSC中的服务创建,并将NServiceBus.Host.exe /install作为服务/应用程序部署脚本的一部分运行。显然,只有在配置服务器之后才能进行部署。因此,它需要将DSC脚本的Windows服务部分剥离到例如仅确保服务存在 - 在第一次部署应用程序之前,验证将失败。

0 个答案:

没有答案