Déployer un service Windows .NET Core avec Topshelf

Déploiement d'un service Windows .NET Core via Topshelf

Commencze par initialiser un projet de type worker .NET Core à partir d'un modèle standard.

Ouvrez ensuite le fichier Programme.cs pour y apporter des modifications.

namespace ServiceWorkerNetCore
{
    public class Programme
    {
        public static void Main(string[] arguments)
        {
            ConfigurerHote(arguments).Build().Run();
        }

        public static IHostBuilder ConfigurerHote(string[] arguments) =>
            Host.CreateDefaultBuilder(arguments)
                .ConfigureServices((contexteHote, services) =>
                {
                    services.AddHostedService<tacheworker>();
                });
    }
}
</tacheworker>

Installez ensuite le paquet NuGet Topshelf dans votre projet.

Réécrivez le fichier Programme.cs pour intégrer la configuraton Topshelf.

    public class Programme
    {
        public static void Main(string[] arguments)
        {
            HostFactory.Run(configurateur =>
            {
                configurateur.Service<IHost>(service =>
                {
                    service.ConstructUsing(() => ConfigurerHote(arguments).Build());
                    service.WhenStarted(hote =>
                    {
                        hote.Start();
                    });
                    service.WhenStopped(hote =>
                    {
                        hote.StopAsync();
                    });
                });

                configurateur.StartAutomatically();
                configurateur.RunAsLocalSystem();

                configurateur.SetServiceName("MonServiceWindows.NomService");
                configurateur.SetDisplayName("MonServiceWindows.NomAffichage");
                configurateur.SetDescription("MonServiceWindows.Description");
            });
        }

        public static IHostBuilder ConfigurerHote(string[] arguments) =>
            Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder(arguments)
                .ConfigureServices((contexteHote, services) =>
                {
                    services.AddHostedService<tacheworker>();
                });
    }
</tacheworker>

Cette approche s'appuie sur l'interface IHost du .NET Generic Host pour gérer le cycle de vie de l'application.

Voici une illustration alternative de la gestion de l'hôte :

public class ServiceHote
{
    private IHost _hote;

    public ServiceHote()
    {
        _hote = new HostBuilder()
            .Build();
    }

    public async Task DemarrerAsync()
    {
        _hote.StartAsync();
    }

    public async Task ArreterAsync()
    {
        using (_hote)
        {
            await _hote.StopAsync(TimeSpan.FromSeconds(5));
        }
    }
}

Procédures de déploiement

Installation du service

Naviguez vers le répertoire contenant l'exécutable et lancez la commande :

MonServiceWindows.exe install

Démarrage du service

MonServiceWindows.exe start

Désinstallation du service

MonServiceWindows.exe uninstall

Configuration avancée du .NET Generic Host

Paramétrage des configurations

Host.CreateDefaultBuilder(arguments)
    .ConfigureHostConfiguration(configHote =>
    {
        configHote.SetBasePath(Directory.GetCurrentDirectory());
        configHote.AddJsonFile("parametresHote.json", optional: true);
        configHote.AddEnvironmentVariables(prefix: "PREF_");
        configHote.AddCommandLine(arguments);
    });

Définition de l'environnement

Host.CreateDefaultBuilder(arguments)
    .UseEnvironment("Developpement")

Intégration du journalisation

    .ConfigureLogging((contexte, logger) =>
    {
        logger.AddConsole();
        logger.SetMinimumLevel(LogLevel.Information);
    })

Injection de dépendances

    public class TacheCalcul
    {
        public string HeureActuelle()
        {
            return DateTime.Now.ToString();
        }
    }

    // Dans Programme.cs
    .ConfigureServices((contexteHote, services) =>
    {
        services.AddScoped<TacheCalcul>();
        services.AddHostedService<TacheWorker>();
    });

Version finale du Programme.cs

using System.IO;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Topshelf;

namespace ServiceWorkerNetCore
{
    public class Programme
    {
        public static void Main(string[] arguments)
        {
            HostFactory.Run(configurateur =>
            {
                configurateur.Service<IHost>(service =>
                {
                    service.ConstructUsing(() => ConfigurerHote(arguments).Build());
                    service.WhenStarted(hote =>
                    {
                        hote.Start();
                    });
                    service.WhenStopped(hote =>
                    {
                        hote.StopAsync();
                    });
                });

                configurateur.StartAutomatically();
                configurateur.RunAsLocalSystem();

                configurateur.SetServiceName("MonServiceWindows.NomService");
                configurateur.SetDisplayName("MonServiceWindows.NomAffichage");
                configurateur.SetDescription("MonServiceWindows.Description");
            });
        }

        public static IHostBuilder ConfigurerHote(string[] arguments) =>
            Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder(arguments)
                .UseEnvironment(Environments.Development)
                .ConfigureHostConfiguration(configHote =>
                {
                    configHote.SetBasePath(Directory.GetCurrentDirectory());
                    configHote.AddJsonFile("parametresHote.json", optional: true);
                    configHote.AddEnvironmentVariables(prefix: "PREF_");
                    configHote.AddCommandLine(arguments);
                })
                .ConfigureLogging((contexte, logger) =>
                {
                    logger.AddConsole();
                    logger.SetMinimumLevel(LogLevel.Information);
                })
                .ConfigureServices((contexteHote, services) =>
                {
                    services.AddScoped<TacheCalcul>();
                    services.AddHostedService<TacheWorker>();
                });
    }
}

Étiquettes: Topshelf .NET Core Service Windows C# Hébergement .NET

Publié le 7 juillet à 20h57