使用顶层货架和温莎城堡托管 WCF 服务
Host WCF service using top shelf and windsor castle
我正在使用 Topshelf 运行 我的 wcf 服务和温莎城堡进行依赖注入。当我直接 运行 主机程序时,它 运行 作为控制台主机没问题,但同一程序在尝试将其作为 windows 服务启动时出现此错误。
Topshelf.Hosts.StartHost Error: 0 : The service failed to start., System.Invalid
OperationException: Cannot start service MyService on computer '.'. ---> Sy
stem.ComponentModel.Win32Exception: The service did not respond to the start or
control request in a timely fashion
--- End of inner exception stack trace ---
at System.ServiceProcess.ServiceController.Start(String[] args)
at System.ServiceProcess.ServiceController.Start()
at Topshelf.Runtime.Windows.WindowsHostEnvironment.StartService(String servic
eName, TimeSpan startTimeOut)
at Topshelf.Hosts.StartHost.Run()
下面是我的实现:-
class Program{
static void Main(string[] args)
{
var boot = new ServiceInstaller();
HostFactory.Run(x =>
{
x.Service<Program>(s =>
{
s.ConstructUsing(name => new Program());
s.WhenStarted(p => p.Start());
s.WhenStopped(p => p.Stop());
});
x.DependsOnMsSql();
x.StartAutomatically();
x.SetDisplayName("My Service");
x.SetServiceName("MyService");
});
}
public void Start()
{
try
{
_serviceProvider = typeof(IMyService).AssemblyQualifiedName;
LogMessage(LogLevel.INFO, _serviceProvider, null);
if (_serviceProvider == null)
{
throw new ArgumentNullException(string.Format(CultureInfo.InvariantCulture, "Failed to start service: {0}", _serviceProvider));
}
_serviceHost = new DefaultServiceHostFactory().CreateServiceHost(_serviceProvider, new Uri[0]);
_serviceHost.Open();
}
catch (Exception ex)
{
LogMessage(LogLevel.ERROR, "Error occurred while starting My Service", ex);
throw;
}
}
public void Stop()
{
try
{
_serviceHost.Close();
_serviceHost = null;
}
catch (Exception ex)
{
LogMessage(LogLevel.ERROR, "Error occurred while stopping My service ", ex);
throw;
}
}
}
public Class ServiceInstaller{
public static IWindsorContainer Container { get; private set; }
public ServiceInstaller()
{
try
{
Container = new WindsorContainer();
Container.Register(Component.For<IWindsorContainer>().Instance(Container));
Container.AddFacility<WcfFacility>().Register
(
Component.For<IDependency>().ImplementedBy<Dependency>().LifestyleTransient(),
Component.For<IMyService>().ImplementedBy<MyService>().LifestyleTransient()
);
}
catch (Exception ex)
{
throw;
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (Container != null)
{
Container.Dispose();
Container = null;
}
}
}
}
我发现在注入的依赖项中,我在构造函数中有访问数据库的代码。一旦我删除了该代码,它就可以正常工作。不知道为什么在 运行 使用控制台主机时相同的代码运行良好。我猜温莎城堡有问题。
我正在使用 Topshelf 运行 我的 wcf 服务和温莎城堡进行依赖注入。当我直接 运行 主机程序时,它 运行 作为控制台主机没问题,但同一程序在尝试将其作为 windows 服务启动时出现此错误。
Topshelf.Hosts.StartHost Error: 0 : The service failed to start., System.Invalid
OperationException: Cannot start service MyService on computer '.'. ---> Sy
stem.ComponentModel.Win32Exception: The service did not respond to the start or
control request in a timely fashion
--- End of inner exception stack trace ---
at System.ServiceProcess.ServiceController.Start(String[] args)
at System.ServiceProcess.ServiceController.Start()
at Topshelf.Runtime.Windows.WindowsHostEnvironment.StartService(String servic
eName, TimeSpan startTimeOut)
at Topshelf.Hosts.StartHost.Run()
下面是我的实现:-
class Program{
static void Main(string[] args)
{
var boot = new ServiceInstaller();
HostFactory.Run(x =>
{
x.Service<Program>(s =>
{
s.ConstructUsing(name => new Program());
s.WhenStarted(p => p.Start());
s.WhenStopped(p => p.Stop());
});
x.DependsOnMsSql();
x.StartAutomatically();
x.SetDisplayName("My Service");
x.SetServiceName("MyService");
});
}
public void Start()
{
try
{
_serviceProvider = typeof(IMyService).AssemblyQualifiedName;
LogMessage(LogLevel.INFO, _serviceProvider, null);
if (_serviceProvider == null)
{
throw new ArgumentNullException(string.Format(CultureInfo.InvariantCulture, "Failed to start service: {0}", _serviceProvider));
}
_serviceHost = new DefaultServiceHostFactory().CreateServiceHost(_serviceProvider, new Uri[0]);
_serviceHost.Open();
}
catch (Exception ex)
{
LogMessage(LogLevel.ERROR, "Error occurred while starting My Service", ex);
throw;
}
}
public void Stop()
{
try
{
_serviceHost.Close();
_serviceHost = null;
}
catch (Exception ex)
{
LogMessage(LogLevel.ERROR, "Error occurred while stopping My service ", ex);
throw;
}
}
}
public Class ServiceInstaller{
public static IWindsorContainer Container { get; private set; }
public ServiceInstaller()
{
try
{
Container = new WindsorContainer();
Container.Register(Component.For<IWindsorContainer>().Instance(Container));
Container.AddFacility<WcfFacility>().Register
(
Component.For<IDependency>().ImplementedBy<Dependency>().LifestyleTransient(),
Component.For<IMyService>().ImplementedBy<MyService>().LifestyleTransient()
);
}
catch (Exception ex)
{
throw;
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (Container != null)
{
Container.Dispose();
Container = null;
}
}
}
}
我发现在注入的依赖项中,我在构造函数中有访问数据库的代码。一旦我删除了该代码,它就可以正常工作。不知道为什么在 运行 使用控制台主机时相同的代码运行良好。我猜温莎城堡有问题。