2015-03-02 3 views
1

Я использую Topshelf для запуска службы wcf и виндзорского замка для инъекций зависимости. Проблема при запуске программы-хоста напрямую, она отлично работает как консольный хост, но одна и та же программа дает эту ошибку при попытке запустить ее в качестве службы Windows.Хост WCF с использованием верхней полки и замка виндзора

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; 
       } 
      } 
     } 
    } 
+0

Возможно, код в Start вызывает исключение при работе в качестве службы. Попробуйте поместить сообщение журнала после каждого утверждения и перед первым, чтобы увидеть, какая строка бросает. – Marwijn

+0

Это, вероятно, правда, но почему он отлично работает при отладке через Visual Studio или просто запускает его в папке bin. – Pijush

+0

Вы проверили журналы событий Windows, чтобы узнать, зарегистрировано ли там исключение? – RagtimeWilly

ответ

0

Я обнаружил, что в моей закачиваемой зависимости у меня есть код для доступа к базе данных в конструкторе. Как только я удалил этот код, он работал нормально. Не знаю, почему тот же код работает нормально при работе с консольным хостом. Я думаю, какая-то проблема с виндзором замка.