Dans .NET Core 3.0, nous introduisons un nouveau type de modèle d'application appelé Worker Service. Ce modèle est conçu pour 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.

Travailleur de création
Remarque Dans nos versions préliminaires, 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éation d'un travailleur dans Visual Studio



Création d'un travailleur sur la ligne de commande
Exécuter dotnet new worker

Exécution en tant que service Windows
Pour démarrer en tant que service Windows, nous avons besoin que notre travailleur voit les signaux de démarrage et d'arrêt du type ServiceBase
.NET, qui connecte les systèmes de service Windows aux applications .NET. Pour ce faire, vous avez besoin de:
Ajouter Microsoft.Extensions.Hosting.WindowsServices
package NuGet Microsoft.Extensions.Hosting.WindowsServices

Ajoutez l'appel HostBuilder
à HostBuilder
dans HostBuilder
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 plusieurs choses. Premièrement, il vérifie si l'application fonctionne vraiment comme un service Windows, si ce n'est pas le cas, puis il exécute noops, ce qui rend cette méthode sûre à appeler lors de l'exécution locale ou en tant que service Windows.
Deuxièmement, il configure votre hôte pour utiliser ServiceBaseLifetime
. ServiceBaseLifetime
fonctionne avec ServiceBase
pour aider à contrôler la durée de vie de votre application lorsqu'elle démarre en tant que service Windows. Cela remplace la ConsoleLifetime
standard qui gère les signaux tels que CTL + C.
Installer le travailleur
Une fois que le travailleur a utilisé ServiceBaseLifetime
nous devons le définir:
Tout d'abord, publions l'application. Nous installerons le service Windows sur place, ce qui signifie que l'exécutable sera bloqué à chaque démarrage du service. La publication est un bon moyen de s'assurer que tous les fichiers nécessaires au démarrage du service sont au même endroit et prêts à être installés.
dotnet publish -oc:\code\workerpub
Ensuite, vous pouvez utiliser l' utilitaire sc dans la ligne de commande admin
sc create workertest binPath=c:\code\workerpub\WorkerTest.exe
Par exemple:

Note de sécurité: cette commande démarre le service en tant que système local, ce qui n'est pas ce dont vous avez besoin . Au lieu de cela, vous devez créer un compte de service et démarrer le service Windows en tant que ce compte. Nous n'en parlerons pas ici, mais il existe de la documentation ASP.NET 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 service de journal des événements, qui peut envoyer des messages de journal directement au journal des événements Windows. Pour accéder 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 ultérieurs
Dans les aperçus suivants, nous prévoyons d'améliorer l'utilisation des travailleurs avec les services Windows:
- Renommez UseWindowsServiceBaseLifetime en UseWindowsService
- Ajoutez une intégration automatique et améliorée avec le journal des événements au démarrage en tant que service Windows.
Conclusion
Nous espérons que vous essayerez notre nouveau modèle et voudrez savoir comment cela fonctionne. Vous pouvez envoyer des messages d'erreur ou des suggestions ici: https://github.com/aspnet/AspNetCore/issues/new/choose
