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

Trabalhador de criação
Nota Nas versões de pré-lançamento, 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 no Assistente para Criar Novo Projeto.
Criando um trabalhador no Visual Studio



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

Executando como um serviço do Windows
Para iniciar como um serviço do Windows, precisamos que o nosso trabalhador veja os sinais de início e parada do tipo ServiceBase
.NET, que conecta os sistemas Windows Service aos aplicativos .NET. Para fazer isso, você precisa:
Adicionar Microsoft.Extensions.Hosting.WindowsServices
NuGet Package

Adicione a chamada HostBuilder
ao HostBuilder
em 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. Primeiramente, ele verifica se o aplicativo realmente funciona como um serviço do Windows, se não estiver, e executa noops, o que torna seguro chamar esse método ao executar localmente ou como um serviço do Windows.
Em segundo lugar, ele configura seu host para usar ServiceBaseLifetime
. ServiceBaseLifetime
trabalha com o ServiceBase
para ajudar a controlar a vida útil do seu aplicativo quando ele é iniciado como um serviço do Windows. Isso substitui o ConsoleLifetime
padrão que lida com sinais como CTL + C.
Instalar trabalhador
Depois que conseguimos o trabalhador usando ServiceBaseLifetime
, precisamos configurá-lo:
Primeiro, vamos publicar o aplicativo. Instalaremos o Serviço Windows no local, o que significa que o executável será bloqueado toda vez que o serviço for iniciado. A publicação é uma boa maneira de garantir que todos os arquivos necessários para iniciar o serviço estejam em um local e prontos para instalação.
dotnet publish -oc:\code\workerpub
Em seguida, você pode usar o utilitário sc na linha de comando do administrador
sc create workertest binPath=c:\code\workerpub\WorkerTest.exe
Por exemplo:

Nota de segurança: Este comando inicia o serviço como um sistema local, que não é o que você precisa . Em vez disso, você deve criar uma conta de serviço e iniciar o serviço do Windows como esta conta. Não falaremos sobre isso aqui, mas há alguma documentação do ASP.NET 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 serviço de log de eventos, que pode enviar mensagens de log diretamente para o log de eventos do Windows. Para inserir o 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 adicional
Nas visualizações a seguir, planejamos melhorar o uso de Trabalhadores com Serviços do Windows:
- Renomear UseWindowsServiceBaseLifetime para usarWindowsService
- Adicione integração automática e aprimorada ao log de eventos na inicialização como um serviço do Windows.
Conclusão
Esperamos que você experimente nosso novo modelo e queira saber como ele funciona. Você pode enviar mensagens de erro ou sugestões aqui: https://github.com/aspnet/AspNetCore/issues/new/choose
