Dans .NET Core 3.0, nous introduisons un nouveau type de modèle d'application appelé Worker Service. Ce modèle est destiné à vous donner un point de départ pour écrire des services de longue durée dans .NET Core. Dans cette procédure pas à pas, nous allons créer un travailleur et l'exécuter en tant que service Windows.

Créer un travailleur
Aperçu: dans nos versions d'aperçu, le modèle de travail se trouve dans le même menu que les modèles Web. Cela va changer dans une prochaine version. Nous avons l'intention de placer le modèle Worker Service directement dans l'assistant de création de projet.
Créer un travailleur dans Visual Studio



Créer un travailleur sur la ligne de commande
Exécuter dotnet new worker

Exécuter en tant que service Windows
Pour fonctionner en tant que service Windows, nous avons besoin que notre collaborateur écoute les signaux de démarrage et d'arrêt de ServiceBase
type .NET qui expose les systèmes de service Windows aux applications .NET. Pour ce faire, nous voulons:
Ajoutez le package NuGet Microsoft.Extensions.Hosting.WindowsServices

Ajoutez l'appel UseServiceBaseLifetime
à HostBuilder
dans notre Program.cs
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseServiceBaseLifetime() .ConfigureServices(services => { services.AddHostedService<Worker>(); }); }
Cette méthode fait deux ou trois choses. Tout d'abord, il vérifie si l'application s'exécute réellement en tant que service Windows, si ce n'est pas le cas, elle noops qui rend cette méthode sûre pour être appelée lors de l'exécution locale ou lors de l'exécution en tant que service Windows. Vous n'avez pas besoin d'y ajouter de clauses de garde et vous pouvez simplement exécuter l'application normalement lorsqu'elle n'est pas installée en tant que service Windows.
Deuxièmement, il configure votre hôte pour utiliser un ServiceBaseLifetime
. ServiceBaseLifetime
fonctionne avec ServiceBase
pour aider à contrôler la durée de vie de votre application lorsqu'elle est exécutée en tant que service Windows. Cela remplace la ConsoleLifetime
par défaut qui gère les signaux comme CTL + C.
Installer le travailleur
Une fois que notre travailleur utilise ServiceBaseLifetime
nous devons alors l'installer:
Tout d'abord, permet de publier l'application. Nous installerons le service Windows sur place, ce qui signifie que l'exe sera verrouillé chaque fois que le service est en cours d'exécution. L'étape de publication est un bon moyen de s'assurer que tous les fichiers dont j'ai besoin pour exécuter le service sont au même endroit et prêts à être installés.
dotnet publish -oc:\code\workerpub
Ensuite, nous pouvons utiliser l' utilitaire sc dans une invite de commande admin
sc create workertest binPath=c:\code\workerpub\WorkerTest.exe
Par exemple:

Note de sécurité: Cette commande fait exécuter le service en tant que système local, ce qui n'est généralement pas quelque chose que vous voudrez faire . Au lieu de cela, vous devez créer un compte de service et exécuter le service Windows en tant que ce compte. Nous n'en parlerons pas ici, mais il existe de la documentation sur les documents ASP.NET en parlant ici: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows- service? view = aspnetcore-2.2
Journalisation
Le système de journalisation dispose d'un fournisseur de journal des événements qui peut envoyer un message de journal directement au journal des événements Windows. Pour vous connecter au journal des événements, vous pouvez ajouter le package Microsoft.Extensions.Logging.EventLog
, puis modifier votre Program.cs
:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(loggerFactory => loggerFactory.AddEventLog()) .ConfigureServices(services => { services.AddHostedService<Worker>(); });
Travaux futurs
Dans les aperçus à venir, nous prévoyons d'améliorer l'expérience d'utilisation des travailleurs avec les services Windows en:
- Renommez UseWindowsServiceBaseLifetime en UseWindowsService
- Ajoutez une intégration automatique et améliorée avec le journal des événements lors de l'exécution en tant que service Windows.
Conclusion
Nous espérons que vous essayez ce nouveau modèle et que vous souhaitez nous faire savoir comment cela se passe, vous pouvez déposer des bugs ou des suggestions ici: https://github.com/aspnet/AspNetCore/issues/new/choose
