· Andrés Ledo · NET · Lectura en 4 min
C#: Cómo crear un servicio con .NET 6
Algunas aplicaciones como sincronizadores o cualquier aplicación que tenga que realizar una tarea en menos de un minuto es interesante que se ejecuten mediante un servicio.
Índice
Creación del proyecto Worker Service
El primer paso para crear un servicio con .NET 6 es abrir Visual Studio y crear un nuevo proyecto del tipo «Worker Service».
El siguiente paso sería escoger el nombre para nuestro proyecto y la ubicación donde guardarlo.
Para acabar de configurar nuestro proyecto escogemos como plataforma de destino .NET 6.
Ya tenemos creado nuestro proyecto, la clase Worker es la encargada de ejecutar la acción de nuestro servicio
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
}
}
La parte que nos interesa es ExecuteAsync, es aquí donde debemos configurar las acciones que queramos que haga nuestro servicio.
En la parte del código await Task.Delay(1000, stoppingToken); le indicamos en milisegundos cuanto tiempo debe esperar entre ejecuciones, si no incluimos esta parte automáticamente cuando el método acabe se volverá a ejecutar instantáneamente. El tiempo se indica en milisegundos 1000 ms = 1 s.
Una buena práctica es no incluir directamente el código en esta clase, sino referenciar a un proyecto que contenga nuestros servicios y llamar al servicio directamente. Aunque como este artículo es un ejemplo, incluiremos el código directamente en la clase.
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
string path = @"C:\ServiceTest\";
//Creamos el directorio
Directory.CreateDirectory(path);
//Establecemos la ubicación del fichero de texto
path += "output.txt";
//Escribimos en el fichero
using (StreamWriter sw = File.AppendText(path))
{
sw.WriteLine($"Hello world from the {DateTime.Now}");
}
//Se ejecutará cada 1000 ms = 1 segundo
await Task.Delay(1000, stoppingToken);
}
}
Es un servicio que realmente no hace nada útil, pero nos servirá para saber si se está ejecutando correctamente.
Instalar el servicio .NET 6 en Windows
Por defecto, .NET 6 no trae el paquete necesario para que nuestro servicio funcione sobre Windows, simplemente tenemos que agregar el siguiente paquete NuGet a nuestro proyecto:
Por último, tenemos que llamar al paquete que acabamos de instalar, en nuestro Program.cs, simplemente escribimos .UseWindowsService(), justo debajo del .ConfigureServices quedando el código de nuestro program así:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace ServiceTest
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
})
//Metodo que permite ejecutar el servicio en Windows.
.UseWindowsService();
}
}
Para instalar el servicio compilamos nuestra aplicación en Release y copiamos los ficheros en el directorio donde queramos instalar la aplicación.
Abrimos una consola de comandos como administrador y escribimos el siguiente comando:
SC CREATE "NombreServicio" binpath="Path Al exe de nuestro servicio"
Si te aparece algún mensaje de acceso denegado es que no has ejecutado la consola como administrador. Si te aparece el comando como en la imagen es que se instaló correctamente y ya puedes buscarlo en el listado de servicios de Windows.
Si al arrancar el servicio te da un error es posible que no hayas instalado el runtime de .Net en el equipo. Puedes descargarlo desde este enlace.
Desinstalar el servicio
Para acabar el artículo, como supongo que no querrás tener un servicio que simplemente dice hola en tu equipo, debes de saber que puedes desinstalarlo escribiendo el siguiente comando en una consola de administrador.
SC DELETE "NombreServicio"
Es recomendable parar el servicio antes o seguramente deberás reiniciar.
Para crear un instalador para el servicio sigue este tutorial.
Para acabar el artículo, si estás pensando en comprar hosting o en comprar dominio Web, déjame recomendarte estos artículos: