.NET Core Workers como servicios de Windows

En .NET Core 3.0 estamos presentando un nuevo tipo de plantilla de aplicación llamada Worker Service. Esta plantilla está destinada a proporcionarle un punto de partida para escribir servicios de larga ejecución en .NET Core. En este tutorial crearemos un trabajador y lo ejecutaremos como un Servicio de Windows.



Crear un trabajador


Nota de vista previa: en nuestras versiones de vista previa, la plantilla del trabajador se encuentra en el mismo menú que las plantillas web. Esto cambiará en una versión futura. Tenemos la intención de colocar la plantilla de Worker Service directamente dentro del asistente para crear un nuevo proyecto.


Crear un trabajador en Visual Studio


imagen


imagen


imagen


Crear un trabajador en la línea de comando


Ejecute dotnet new worker


imagen


Ejecutar como un servicio de Windows


Para funcionar como un Servicio de Windows, necesitamos que nuestro trabajador escuche las señales de inicio y parada de ServiceBase el tipo .NET que expone los sistemas del Servicio de Windows a las aplicaciones .NET. Para hacer esto queremos:


Agregue el paquete NuGet de Microsoft.Extensions.Hosting.WindowsServices


imagen


Agregue la llamada UseServiceBaseLifetime al HostBuilder en nuestro 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>(); }); } 

Este método hace un par de cosas. Primero, verifica si la aplicación se está ejecutando o no como un Servicio de Windows, si no lo hace, entonces noops lo que hace que este método sea seguro cuando se ejecuta localmente o cuando se ejecuta como un Servicio de Windows. No necesita agregarle cláusulas de protección y solo puede ejecutar la aplicación normalmente cuando no está instalada como un Servicio de Windows.


En segundo lugar, configura su host para usar un ServiceBaseLifetime . ServiceBaseLifetime funciona con ServiceBase para ayudar a controlar la vida útil de su aplicación cuando se ejecuta como un Servicio de Windows. Esto anula el valor predeterminado de ConsoleLifetime que maneja señales como CTL + C.


Instalar al trabajador


Una vez que tengamos a nuestro trabajador utilizando ServiceBaseLifetime debemos instalarlo:


Primero, publiquemos la aplicación. Instalaremos el Servicio de Windows en el lugar, lo que significa que el exe se bloqueará cada vez que se ejecute el servicio. El paso de publicación es una buena manera de asegurarse de que todos los archivos que necesito para ejecutar el servicio estén en un solo lugar y listos para ser instalados.


 dotnet publish -oc:\code\workerpub 

Entonces podemos usar la utilidad sc en un símbolo del sistema de administración


 sc create workertest binPath=c:\code\workerpub\WorkerTest.exe 

Por ejemplo:


imagen


Nota de seguridad: este comando tiene el servicio ejecutado como sistema local, que no es algo que generalmente desee hacer . En su lugar, debe crear una cuenta de servicio y ejecutar el servicio de Windows como esa cuenta. No hablaremos de eso aquí, pero hay algo de documentación en los documentos de ASP.NET que habla aquí: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows- service? view = aspnetcore-2.2


Registro


El sistema de registro tiene un proveedor de registro de eventos que puede enviar mensajes de registro directamente al registro de eventos de Windows. Para iniciar sesión en el registro de eventos, puede agregar el paquete Microsoft.Extensions.Logging.EventLog y luego modificar su Program.cs :


 public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(loggerFactory => loggerFactory.AddEventLog()) .ConfigureServices(services => { services.AddHostedService<Worker>(); }); 

Trabajo futuro


En las próximas previsualizaciones, planeamos mejorar la experiencia del uso de Trabajadores con servicios de Windows mediante:


  1. Cambie el nombre de UseWindowsServiceBaseLifetime a UseWindowsService
  2. Agregue integración automática y mejorada con el registro de eventos cuando se ejecuta como un servicio de Windows.

Conclusión


Esperamos que pruebe esta nueva plantilla y que nos haga saber cómo funciona, puede presentar cualquier error o sugerencia aquí: https://github.com/aspnet/AspNetCore/issues/new/choose


Avatar
Glenn condron

Source: https://habr.com/ru/post/446508/


All Articles