ASP .NET Core - Modelo de Hospedagem InProcess


  Neste artigo vamos entender o modelo de hospedagem InProcess da ASP .NET Core.

Depois de concluir o desenvolvimento da sua aplicação ASP.NET Core, você tem que implantá-la em um servidor para que os usuários possam acessar a sua aplicação. Na implantação no IIS, a ASP.NET Core oferece dois modelos de hospedagem: InProcess e OutOfProcess.

Ao implantar sua aplicação Web no IIS, várias requisições feitas ao seu aplicativo são tratadas pelo ASP.NET Core Module (Módulo Principal da ASP.NET Core). Por padrão o modelo de hospedagem definido para sua aplicação é o modelo InProcess.

Isso significa que a ASP.NET Core Module encaminha as requisições ao IIS HTTP Server (IISHttpServer). O servidor HTTP do IIS é um servidor executado em processo com o IIS. Isso resulta em ótimo desempenho em comparação com o modelo OutProcess, pois o modelo InProcess ignora o IIS e usa o servidor Kestrel interno da ASP.NET Core.

Você pode definir o modelo de hospedagem definindo no seu arquivo de projeto a tag a seguir:

<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>

Quando um aplicativo principal do ASP.NET é executado, o runtime do .NET procura o método Main(), que é o ponto de entrada para o aplicativo. O método Main() chama o método estático CreateHostBuilder() que chama o método CreateDefaultBuilder.

No caso de hospedagem InProcess, o método CreateDefaultBuilder() chama o método UseIIS() e hospeda o aplicativo dentro do processo de trabalho do IIS (w3wp.exe ou iisexpress.exe).

Nota: Do ponto de vista do desempenho, a hospedagem InProcess oferece uma taxa de transferência de requisições significativamente maior que a hospedagem OutOfProcess.

No caso do IIS, o nome do processo que executa o aplicativo é w3wp e, no caso do IIS Express, é iisexpress. Para obter o nome do processo executando o aplicativo, use o seguinte comando: System.Diagnostics.Process.GetCurrentProcess().ProcessName

Quando executamos o projeto no Visual Studio, ele usa o IISExpress por padrão. O IIS Express é uma versão leve e independente do IIS, otimizada para o desenvolvimento de aplicativos. Em produção é usado o IIS.

Quando criamos o projeto web usando a ferramenta de linha de comando NET CLI a aplicação vai usar o servidor Kestrel como servidor da web.

O Kestrel é um servidor Web multiplataforma para o ASP.NET Core. É suportado em todas as plataformas e versões suportadas pelo .NET Core. Ele está incluído por padrão como servidor interno no ASP.NET Core.

O Kestrel pode ser usado, por si só, como um servidor de borda, ou seja, um servidor da Web voltado para a Internet que pode processar diretamente as solicitações HTTP recebidas do cliente. No Kestrel, o processo usado para hospedar o aplicativo é o dotnet.exe.

Para configurar no seu projeto o modelo de hospedagem para InProcess declare a tag AspNetCoreHostingModel conforme abaixo:

Após criar o seu projeto clique no menu Build> Publish e implante faça o Web Deploy (ou copie manualmente para o IIS) no IIS.

Depois de concluir a implantação do aplicativo, localize o arquivo web.config gerado durante o processo de implantação. Neste web.config você encontrará uma seção como esta:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet" arguments=".\TesteApi.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" />
    </system.webServer>
  </location>
</configuration>

Observe que aqui definimos hostingModel como InProcess.

Agora, execute o aplicativo no navegador com essa configuração padrão e observe os Headers HTTP. Você poderá identificar qual o processo esta sendo executado, no caso o IIS, e deverá obter algo parecido com o mostrado na figura abaixo:

Se você alterar o modelo para OutProcess vai ver que o valor exibido no Header Http será : servidor Kestrel.

E estamos conversados...

"(Disse Jesus)Passará o céu e a terra, mas as minhas palavras não hão de passar."
Lucas 21:33

Referências:


José Carlos Macoratti