ASP .NET Core 3.1 - Criando um Serviço do Windows


  Neste artigo vamos mostrar como hospedar uma aplicação ASP.NET Core Web APi como um serviço do Windows.

Na maioria dos cenários em que precisamos criar um aplicativo de execução demorada, usar um serviço Windows pode ser uma boa opção. Lembrando que os serviços do Windows exigem um arquivo exe, ou seja, executável do nosso aplicativo para execução.

A partir da versão 3.0 a .NET Core apresentou o template Worker Service que tem como objetivo simplificar a criação de aplicações que serão executadas como um processo.

Mas o Worker Service é assunto para outro artigo, hoje vamos falar de criar um aplicação web como um serviço.

E por que eu deveria implantar aplicativos como um serviço do Windows?

Quando criamos um aplicativo, precisamos hospedá-lo em algum lugar para que os usuários possam acessá-lo. Podemos hospedá-lo no IIS ou como um serviço do Windows. Portanto, a seguir, apresentamos alguns motivos para hospedar aplicativos como um serviço do Windows:

  1. Às vezes, hospedamos nossos aplicativos no IIS, mas não utilizamos todos os recursos do IIS.
     
  2. Se a máquina em que estamos hospedando o aplicativo Web não tiver o IIS ativado ou se o IIS estiver ativado, mas não configurado para hospedar um aplicativo .NET Core.

O .NET Core fornece um modo de implantação chamado SCD (Implantação Independente). Quando publicamos nosso aplicativo como SCD, ele fornecerá o executável do aplicativo, juntamente com as DLLs de runtime do .NET Core.  Isso simplifica muito a criação de um serviço.

Então chega de prosa e vamos para a prática onde vamos criar uma aplicação ASP .NET Core Web API e depois vamos fazer a sua publicação como um serviço do Windows.

Recursos :

Criando o projeto no VS 2019 Community

Abra o VS 2019 Community e crie uma solução em branco via menu File-> New Project;

Selecione o template ASP .NET Core Web Application, e, Informe o nome AspNet_WindowsService;

A seguir selecione .NET Core e ASP .NET Core 3.1 e marque o template API e as configurações conforme figura abaixo:

Clique no botão Create e pronto. Teremos nossa aplicação Web API pronta.

Vamos alterar o controlador WeatherForecastController criado por padrão na pasta Controllers com o código abaixo:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;

namespace AspNet_WindowsService.Controllers
{
    [ApiController]
    [Route("[controller]")]

    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Frio", "Pouco Frio", "Friozinho", "Agradável", "Legal", "Quente", "Sufocante", "Escaldante", "Torturante", "Inferno na terra"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public string Get()
        {
            return " ---  API Acessada em :" + DateTime.Now.ToLongDateString()  + " -----";
        }

        [HttpGet("tempo")]
        public IEnumerable<WeatherForecast> GetWeather()

        {
            var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
}

Aqui eu crie o método Action HttpGet Get() que retorna uma string com a data e hora atual quando a API for acessada via endpoint : http://locahost:5000/weatherforecast

Alterei o roteamento do outro método HttpGet GetWeather() para exibir a previsão do tempo quando for acessado via  endpoint: http://locahost:5000/weatherforecast/tempo

Agora vamos precisar instalar o pacote Microsoft.Extensions.Hosting.WindowsServices no projeto para poder fazer a publicação da aplicação como um serviço.

Podemos usar a janela do Package Manager e digitar os comandos:

Ou usar a opção Manage Nuget Packages for Solution do menu Tools e na guia Browse selecionar os pacotes acima.

Com esse pacote instalado podemos prosseguir.

Alterando o arquivo Program do projeto API

Vamos agora alterar o código do arquivo Program para podermos publicar nosso projeto como um serviço do Windows.

Abra o arquivo Program e no método CreateHostBuilder inclua a chamada a .UseWindowsService() conforme mostrado abaixo:

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseWindowsService()
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }

Pronto agora vamos publicar a aplicação.

Publicando o projeto WEB API

Clique com o botão direito sobre o nome do projeto e a seguir selecione Publish:

A seguir clique na opção Folder, escolha uma pasta para publicação e clique no link Advanced...

Na janela Publish na opção Deployment Mode selecione a opção : Self-Contained e em Target Runtime escolha win-x64 e clique no botão Save:

De volta a janela Pick a publish target clique em Create Profile:

A segyur clique no botão Publish:

Será exibida a janela Web Publish Activity mostrando o desenvolvimento da publicação. Ao final você verá a mensagem : Web App was published succesfully ......

Nota: Se quiser fazer a publicação usando a ferramenta de linha de comando NET CLI o comando usado é :


   dotnet publish -c Release -r win-x64 --self-contained  

 

Criando o serviço Windows

Agora entre na pasta onde o projeto foi publicado e localize a pasta bin\Release\netcoreapp3.1.

Dentro desta pasta você vai encontrar a pasta win-x64 onde estão as dlls publicadas.

Para criar um serviço do windows abra um prompt de comandos como administrador do sistema e digite o comando:


 sc create <nome_serviço_windows> binPath= <caminho do exe da app> 

 

Para o artigo o comando usado foi:


sc create WinServiceDemo binPath = C:\_asp2020\AspNet_WindowsService\AspNet_WindowsService\bin\Release\netcoreapp3.1\win-x64\AspNet_WindowsService.exe

 

 Conforme mostra a figura abaixo:

 

Pronto o serviço foi criado com sucesso.

Acessando o serviço Windows

Para usar o serviço localize o serviço via Painel de Controle -> Ferramentas Administrativas -> Serviços

E clique com o botão direito sobre o nome do serviço, e a seguir clique em: Iniciar:

Agora é só alegria...

Abrindo o navegador e digitando http://localhost:5000 e a seguir os endpoints da nossa Web API disponibilizada como um serviço Windows, o resultado obtido será:

Esse é uma das alternativas para criar e hospedar uma aplicação Web como um serviço.

"Os meus olhos estão continuamente no Senhor, pois ele tirará os meus pés da rede."
Salmos 25:15

Referências:


José Carlos Macoratti