ASP .NET Core -  Compreendendo o modelo Host Generic


 Hoje veremos como o modelo de Host Genérico funciona na plataforma .NET.

Vamos iniciar este artigo com a definição de host.

Um host é um objeto que encapsula os recursos de um aplicativo, tais como:

O host normalmente é configurado, compilado e executado pelo código na classe Program; nesta classe o método Main:

Quando um host é iniciado, ele chama o método IHostedService.StartAsync em cada implementação de IHostedService registrado na coleção de serviços hospedados do contêiner de serviço. Em uma aplicação web uma das implementações de IHostedService é um serviço Web que inicia uma implementação do servidor HTTP.

Com a separação da execução e inicialização, o Generic Host nos fornece uma maneira mais limpa de configurar e inicializar nossos aplicativos. Por padrão, quando você cria um aplicativo ASP.NET Core agora, seu aplicativo será hospedado usando o modelo Host Genérico. Se você criar um novo aplicativo worker service, ele será hospedado da mesma maneira.

Vamos criar uma nova aplicação Asp.Net Core Web API usando a ferramenta NET CLI emitindo o seguinte comando na janela do PowerShell:

dotnet new webapi -n ApiDemo

E a seguir vamos entrar na pasta ApiDemo e abrir o projeto no VS Code digitando :  code .

Será criada no projeto o arquivo Program.cs que se encarrega de configurar um host definindo um pipeline de processamento de request definido no arquivo Startup.cs.

Observando o método CreateHostBuilder no código acima, ele chama um método estático CreateDefaultBuilder do Host proveniente do namespace Microsoft.Extensions.Hosting. Assim, agora temos um host genérico .NET por padrão. No ASP.NET Core 2.x havia o Web Host que se tornou obsoleto desde o ASP.NET Core 3.0. Assim a partir de agora é recomendável usar o Host Genérico.

Como já mencionei o Host trabalha 'sob o capô' realizando tarefas como:

Se você quer ter mais detalhes de como cada um dos recursos acima atuam dê uma espiada no código fonte no GitHub.

Vejamos a seguir os principais métodos usados na classe Program:

1- Host.CreateDefaultBuilder()

Este método praticamente configura um objeto HostBuilder e o retorna. Não há nada realmente específico para hospedagem na web aqui. É por isso que é comum para cargas de trabalho HTTP e não HTTP.

Dentre as tarefas que ele realiza destacamos as seguintes:

Dando um passo adiante, vamos ver como o host da web é configurado.

2- GenericHostBuilderExtensions.ConfigureWebHostDefaults()

Este método configura um IHostBuilder com padrões para hospedar um aplicativo Web. Assim ele é usado apenas para cargas de trabalho HTTP e vamos ver o que obtemos como a configuração de host da web padrão.

Após as seções de configuração, finalmente chamamos o objeto Run() no IHost implementado em HostingAbstractionsHostExtensions.

Na inicialização os seguintes serviços são registrados de forma automática:

As aplicações Web implementam a interface IWebHostEnvironment, que herda de IHostEnvironment e adiciona o WebRootPath;

Assim, o host é criado e configurado, mas antes de criar e executar, precisamos definir mais configurações no aplicativo, e, fazemos isso na classe Startup.

Na classe Program informamos ao construtor o local da classe de inicialização usando o método : webBuilder.UseStartup<Startup>();

Isso executará o aplicativo e bloqueará a thread de chamada até que o host seja encerrado. Isso é feito pelo método WaitForShutdownAsync, que é chamado no início do processo de inicialização, que pode ser acionado por Ctrl + C, e que retorna uma tarefa concluída.

E estamos conversados...

"E muitos dos que dormem no pó da terra ressuscitarão, uns para vida eterna, e outros para vergonha e desprezo eterno."
Daniel 12:2

Referências:


José Carlos Macoratti