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



Crear un trabajador en la línea de comando
Ejecute dotnet new worker

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

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:

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:
- Cambie el nombre de UseWindowsServiceBaseLifetime a UseWindowsService
- 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
