No .NET Core 3.0, estamos introduzindo um novo tipo de modelo de aplicativo chamado Serviço de Trabalho. Este modelo pretende fornecer um ponto de partida para a criação de serviços de execução longa no .NET Core. Nesta explicação passo a passo, criaremos um trabalhador e o executaremos como um serviço do Windows.

Crie um trabalhador
Observação: Nas nossas versões de prévia, o modelo de trabalho está no mesmo menu que os modelos da Web. Isso mudará em uma versão futura. Pretendemos colocar o modelo de Serviço do Trabalhador diretamente dentro do assistente para criar novo projeto.
Criar um trabalhador no Visual Studio



Crie um trabalhador na linha de comando
Execute o dotnet new worker

Executar como um serviço do Windows
Para executar como um serviço do Windows, precisamos que o nosso funcionário escute os sinais de início e parada do ServiceBase
o tipo .NET que expõe os sistemas de serviço do Windows a aplicativos .NET. Para fazer isso, queremos:
Adicione o pacote NuGet Microsoft.Extensions.Hosting.WindowsServices

Adicione a chamada UseServiceBaseLifetime
ao HostBuilder
em nosso 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 faz algumas coisas. Primeiro, ele verifica se o aplicativo está ou não sendo executado como um serviço do Windows; se não estiver, oops, o que torna esse método seguro para ser chamado ao executar localmente ou ao executar como um serviço do Windows. Você não precisa adicionar cláusulas de guarda e pode executar o aplicativo normalmente quando não estiver instalado como um Serviço do Windows.
Em segundo lugar, ele configura seu host para usar um ServiceBaseLifetime
. ServiceBaseLifetime
trabalha com o ServiceBase
para ajudar a controlar a vida útil do seu aplicativo quando executado como um Serviço do Windows. Isso substitui o ConsoleLifetime
padrão que lida com sinais como CTL + C.
Instale o trabalhador
Depois que tivermos nosso trabalhador usando o ServiceBaseLifetime
, precisaremos instalá-lo:
Primeiro, vamos publicar o aplicativo. Instalaremos o serviço Windows no local, o que significa que o exe será bloqueado sempre que o serviço estiver sendo executado. A etapa de publicação é uma ótima maneira de garantir que todos os arquivos necessários para executar o serviço estejam em um só lugar e prontos para instalação.
dotnet publish -oc:\code\workerpub
Em seguida, podemos usar o utilitário sc em um prompt de comando do administrador
sc create workertest binPath=c:\code\workerpub\WorkerTest.exe
Por exemplo:

Nota de segurança: Este comando tem o serviço executado como sistema local, o que geralmente não é algo que você deseja fazer . Em vez disso, você deve criar uma conta de serviço e executar o serviço do Windows como essa conta. Não falaremos sobre isso aqui, mas há alguma documentação nos documentos do ASP.NET falando sobre isso aqui: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows- service? view = aspnetcore-2.2
Registo
O sistema de log possui um provedor de Log de Eventos que pode enviar mensagens de log diretamente para o Log de Eventos do Windows. Para registrar no log de eventos, você pode adicionar o pacote Microsoft.Extensions.Logging.EventLog
e modificar seu Program.cs
:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(loggerFactory => loggerFactory.AddEventLog()) .ConfigureServices(services => { services.AddHostedService<Worker>(); });
Trabalho futuro
Nas próximas visualizações, planejamos melhorar a experiência do uso de Trabalhadores com Serviços do Windows:
- Renomear UseWindowsServiceBaseLifetime para usarWindowsService
- Adicione uma integração automática e aprimorada ao Log de Eventos ao executar como um Serviço do Windows.
Conclusão
Esperamos que você experimente este novo modelo e deseje que nos informe como ele funciona. Você pode registrar quaisquer bugs ou sugestões aqui: https://github.com/aspnet/AspNetCore/issues/new/choose
