2017-09-05 5 views
1

Après une semaine de recherche et d'essayer de gérer les modifications de session, je n'ai toujours pas réussi à obtenir les résultats que je recherchais. J'ai examiné tous les exemples disponibles et examiné en profondeur le code source TopShelf. Ma classe principale est la suivante:Comment gérer les modifications de session de service avec 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); 

Et voici ma classe de service:

{ 

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

} 

Chaque fois que je lance le code et indépendamment de tout changement que je fais les valeurs par défaut de l'API de code source Topshelf WindowsServiceHost.cs classe sont imprimés au lieu qui est

"[Topshelf] session de service a changé"

mais selon mon code il devrait imprimer "Service session changed !!!!!!!!!!!" isntead. Voici le Top Shelf Source Code auquel je fais allusion et la pièce correspondante commence à la ligne 217. Toute aide grandement appréciée comme toujours.

Répondre

1

Une vieille question, mais je suis en mesure d'obtenir mes événements à tirer à l'aide d'une ma classe IMyService (et béton) qui est « autonome », alias, ne hérite d'une base de service de Microsoft ou topshelf

public interface IMyServiceContract 
{ 
    void Start(); 

    void Stop(); 

    void SessionChanged(Topshelf.SessionChangedArguments args); 
} 

mon béton:

public class MyService : IMyServiceContract 
{ 

    public void Start() 
    { 
    } 

    public void Stop() 
    { 

    } 

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

} 

et ma méthode "Program.cs "principale""

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

Si vous écrivez dans un fichier texte (où j'ai Console.WriteLine (e.ReasonCode);) ... vous pouvez voir les changements. J'ai testé en faisant un LockUser (dans Windows 10 x64) et de se reconnecter.

Cela fonctionne pour moi.

Mon packages.config pour que vous sachiez quelle version de Topshelf J'utilise

<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" />