代码之家  ›  专栏  ›  技术社区  ›  After_Sunset

如何使用TopShelf处理服务会话更改

  •  3
  • After_Sunset  · 技术社区  · 7 年前

    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]服务会话已更改”

    Top Shelf Source Code 我指的是第217行。一如既往,非常感谢您的帮助。

    1 回复  |  直到 7 年前
        1
  •  3
  •   granadaCoder    6 年前

    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);
        }   
    
    }
    

                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();
    

    如果你写一个文本文件(我有控制台。WriteLine(e.ReasonCode);)。。。你可以看到变化。我通过做一个LockUser(在windows 10 x64中)并重新登录进行了测试。

    这对我有用。

    我的包裹。配置以便您知道我使用的是哪个版本的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" />