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:
Formatação de data e hora para uma cultura ...
C# - Calculando a diferença entre duas datas
NET - Padrão de Projeto - Null Object Pattern
C# - Fundamentos : Definindo DateTime como Null ...
ASP .NET Core - Como acessar a configuração .t
ASP .NET - usando o aruqivo de configuração web.config
ASP .NET Core - Fazendo a hospedagem no ..
ASP .NET Core - Modelo de Hospedagem .
NET - Criando uma Self-Host Web API - IV