2017-09-05 46 views
1

经过一周的研究并尝试获取会话更改处理后,我仍然无法获得我期待的结果。我查看了所有可用的示例并彻底检查了TopShelf源代码。我的主类是如下:如何使用TopShelf处理服务会话更改

class Program 
{ 
    static void Main(string[] args) 
    { 
     //Always start out in our apps base directory 
     Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory); 
     const string serviceName = "Service"; 
     const string displayName = "Service"; 
     const string description = "Provide assistance"; 
     try 
     {    
      HostFactory.Run(x => 
      {     
       x.UseCommonLogging(); 
       x.UseNinject(new IocModule());      
       x.Service<ServService.Service.WinService>(sc => 
       {       
        sc.WhenStarted((s, hostControl) => s.Start(hostControl)); 
        sc.WhenStopped((s, hostControl) => s.Stop(hostControl)); 
        sc.WhenSessionChanged((se, e, id) => 
        { 
         se.SessionChange(e, id); 
        }); 
        //sc.WhenSessionChanged((s, chg) => s.SessionChange(chg)); 
        sc.ConstructUsingNinject(); 
       }); 
       x.EnableSessionChanged(); 
       x.RunAsLocalSystem(); 


       x.EnableServiceRecovery(r => 
       { 
        r.RestartService(0); 

       }); 
       x.StartAutomatically();      
       x.SetDescription(description); 
       x.SetDisplayName(displayName); 
       x.SetServiceName(serviceName); 

这里是我的服务类:

{ 

class WinService : ServiceControl 
{ 
    private CancellationTokenSource cancelSource; 
    private CancellationToken ct; 
    public ILog Log { get; private set; } 

    public WinService(ILog logger) 
    { 
     if (logger == null) 
      throw new ArgumentNullException(nameof(logger)); 

    } 

    public void SessionChange(SessionChangedArguments chg) 
    { 
     Log.Info("Service session changed!!!!!!!!!!!"); 
    } 

    //Starts service 
    public bool Start(HostControl hostControl) 
    { 
     Console.Writeline("STARTED!); 
     return true; 
    } 

    //Stops service 
    public bool Stop(HostControl hostControl) 
    { 
     cancelSource.Cancel(); 
     return true; 
    } 

} 

每次我运行代码,也不管我从TopShelf源代码API WindowsServiceHost.cs使默认值进行任何更改类被印刷,而不是它是

“[Topshelf]服务会话改变”

但根据我的代码它应该打印“服务会话更改!!!!!!!!!!!” isntead。这里是我所指的Top Shelf Source Code,以及相关的作品从第217行开始。任何帮助都将不胜感激。

回答

1

一个老问题,但我能得到我的事件用我的IMyService类(和混凝土)火是“独立”,又名,不从微软或topshelf

public interface IMyServiceContract 
{ 
    void Start(); 

    void Stop(); 

    void SessionChanged(Topshelf.SessionChangedArguments args); 
} 
任何服务基地继承

我具体:

public class MyService : IMyServiceContract 
{ 

    public void Start() 
    { 
    } 

    public void Stop() 
    { 

    } 

    public void SessionChanged(SessionChangedArguments e) 
    { 
     Console.WriteLine(e.ReasonCode); 
    } 

} 

和我的 “Program.cs的 ”主“,” 法

  IMyServiceContract myServiceObject = new MyService(); // // container.Resolve<IMyServiceContract>(); 


      HostFactory.Run(x => 
      { 
       x.Service<IMyServiceContract>(s => 
       { 
        s.ConstructUsing(name => myServiceObject); 
        s.WhenStarted(myso => myso.Start()); 
        s.WhenStopped(myso => myso.Stop()); 
        s.WhenSessionChanged((myso, hc, chg) => myso.SessionChanged(chg)); 
       }); 

       x.EnableSessionChanged(); 

如果你写了一个文本文件(我有Console.WriteLine(e.ReasonCode);)...你可以看到更改。我通过执行LockUser(在Windows 10 x64)并重新登录进行测试。

它对我有用。

我packages.config所以你知道我使用的TopShelf版本

<package id="log4net" version="2.0.5" targetFramework="net45" /> 
    <package id="Topshelf" version="4.0.3" targetFramework="net461" /> 
    <package id="Topshelf.Log4Net" version="4.0.3" targetFramework="net461" />