Hospedagem em processo com IIS e ASP.NET Core

Uma hospedagem em processo executa um aplicativo ASP.NET Core no mesmo processo que seu processo de trabalho do IIS. A hospedagem em processo oferece desempenho melhor em hospedagem fora do processo porque as solicitações não são transmitidas por proxy pelo adaptador de loopback, um adaptador de rede que retorna o tráfego de rede de saída para o mesmo computador.

O diagrama a seguir ilustra a relação entre o IIS, o Módulo do ASP.NET Core e um aplicativo hospedado em processo:

ASP.NET Core Module in the in-process hosting scenario

Habilitar a hospedagem em processo

A partir do ASP.NET Core 3.0, a hospedagem em processo foi habilitada por padrão para todos os aplicativos implantados no IIS.

Para configurar explicitamente um aplicativo para hospedagem em processo, defina o valor da propriedade <AspNetCoreHostingModel> como InProcess no arquivo de projeto (.csproj):

<PropertyGroup>
  <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>

Arquitetura geral

O fluxo geral de uma solicitação é o seguinte:

  1. A solicitação chega da Web para o driver do HTTP.sys no modo kernel.
  2. O driver roteia as solicitações nativas ao IIS na porta configurada do site, normalmente, a 80 (HTTP) ou a 443 (HTTPS).
  3. O Módulo do ASP.NET Core recebe a solicitação nativa e a passa para o Servidor HTTP do IIS (IISHttpServer). O servidor HTTP do IIS é uma implementação de servidor em processo do IIS que converte a solicitação de nativa para gerenciada.

Após o servidor HTTP do IIS processar a solicitação:

  1. A solicitação é enviada para o pipeline de middleware do ASP.NET Core.
  2. O pipeline do middleware manipula a solicitação e a passa como uma instância de HttpContext para a lógica do aplicativo.
  3. A resposta do aplicativo é retornada ao IIS por meio do Servidor HTTP do IIS.
  4. O IIS enviará a resposta ao cliente que iniciou a solicitação.

CreateDefaultBuilder adiciona uma instância de IServer chamando o método UseIIS para inicializar o CoreCLR e hospedar o aplicativo no processo de trabalho do IIS (w3wp.exe ou iisexpress.exe). Os testes de desempenho indicam que hospedar um aplicativo em processo do .NET Core oferece uma de taxa de transferência de solicitação significativamente mais elevada em comparação a hospedar o aplicativo fora do processo e enviar por proxy as solicitações para o Kestrel.

Aplicativos publicados como um único arquivo executável não podem ser carregados pelo modelo de hospedagem em processo.

Configuração de aplicativo

Para configurar opções do IIS, inclua uma configuração de serviço para IISServerOptions em Program.cs. O exemplo a seguir desabilita AutomaticAuthentication:

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Server.IIS;
using Microsoft.EntityFrameworkCore;
using RPauth.Data;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();

builder.Services.Configure<IISServerOptions>(options =>
{
    options.AutomaticAuthentication = false;
});

builder.Services.AddTransient<IClaimsTransformation, MyClaimsTransformation>();
builder.Services.AddAuthentication(IISServerDefaults.AuthenticationScheme);

builder.Services.AddRazorPages();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapRazorPages();

app.Run();
Opção Padrão Configuração
AutomaticAuthentication true Se true, o Servidor do IIS define o HttpContext.User autenticado pela Autenticação do Windows. Se false, o servidor fornecerá apenas uma identidade para HttpContext.User e responderá a desafios quando explicitamente solicitado pelo AuthenticationScheme. A autenticação do Windows deve estar habilitada no IIS para que o AutomaticAuthentication funcione. Para obter mais informações, confira Autenticação do Windows.
AuthenticationDisplayName null Configura o nome de exibição mostrado aos usuários em páginas de logon.
AllowSynchronousIO false Se a E/S síncrona é permitida para o HttpContext.Request e o HttpContext.Response.
MaxRequestBodySize 30000000 Obtém ou define o tamanho máximo do corpo da solicitação para o HttpRequest. Observe que o próprio IIS tem o limite maxAllowedContentLength que será processado antes de MaxRequestBodySize definido no IISServerOptions. Alterar MaxRequestBodySize não afetará maxAllowedContentLength. Para aumentar maxAllowedContentLength, adicione uma entrada a web.config para definir maxAllowedContentLength como um valor mais alto. Para obter mais detalhes, confira Configuração.

Diferenças entre hospedagem em processo e fora do processo

As seguintes características se aplicam ao hospedar em processo:

  • O servidor HTTP do IIS (IISHttpServer) é usado em vez do servidor Kestrel. Em processo, CreateDefaultBuilder chama UseIIS para:

    • Registrar o IISHttpServer.
    • Configurar a porta e o caminho base nos quais o servidor deve escutar ao ser executado por trás do Módulo do ASP.NET Core.
    • Configurar o host para capturar erros de inicialização.
  • O atributo requestTimeout não se aplica à hospedagem em processo.

  • Não há suporte para o compartilhamento do pool de aplicativos entre aplicativos. Use um pool de aplicativos por aplicativo.

  • A arquitetura (número de bit) do aplicativo e o runtime instalado (x64 ou x86) devem corresponder à arquitetura do pool de aplicativos. Por exemplo, aplicativos publicados para 32 bits (x86) devem ter a opção de 32 bits habilitada para os Pools de Aplicativos do IIS. Para obter mais informações, consulte a seção Criar o site do IIS.

  • As desconexões do cliente são detectadas. O token de cancelamento HttpContext.RequestAborted é cancelado quando o cliente se desconecta.

  • Ao hospedar em processo, AuthenticateAsync não é chamado internamente para inicializar um usuário. Portanto, uma implementação IClaimsTransformation usada para transformar as declarações após cada autenticação não é ativada por padrão. Quando a transformação de declarações com uma implementação IClaimsTransformation, chame AddAuthentication para adicionar serviços de autenticação:

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Server.IIS;
using Microsoft.EntityFrameworkCore;
using RPauth.Data;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();

builder.Services.Configure<IISServerOptions>(options =>
{
    options.AutomaticAuthentication = false;
});

builder.Services.AddTransient<IClaimsTransformation, MyClaimsTransformation>();
builder.Services.AddAuthentication(IISServerDefaults.AuthenticationScheme);

builder.Services.AddRazorPages();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapRazorPages();

app.Run();

Uma hospedagem em processo executa um aplicativo ASP.NET Core no mesmo processo que seu processo de trabalho do IIS. A hospedagem em processo oferece desempenho melhor em hospedagem fora do processo porque as solicitações não são transmitidas por proxy pelo adaptador de loopback, um adaptador de rede que retorna o tráfego de rede de saída para o mesmo computador.

O diagrama a seguir ilustra a relação entre o IIS, o Módulo do ASP.NET Core e um aplicativo hospedado em processo:

ASP.NET Core Module in the in-process hosting scenario

Habilitar a hospedagem em processo

A partir do ASP.NET Core 3.0, a hospedagem em processo foi habilitada por padrão para todos os aplicativos implantados no IIS.

Para configurar explicitamente um aplicativo para hospedagem em processo, defina o valor da propriedade <AspNetCoreHostingModel> como InProcess no arquivo de projeto (.csproj):

<PropertyGroup>
  <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>

Arquitetura geral

O fluxo geral de uma solicitação é o seguinte:

  1. A solicitação chega da Web para o driver do HTTP.sys no modo kernel.
  2. O driver roteia as solicitações nativas ao IIS na porta configurada do site, normalmente, a 80 (HTTP) ou a 443 (HTTPS).
  3. O Módulo do ASP.NET Core recebe a solicitação nativa e a passa para o Servidor HTTP do IIS (IISHttpServer). O servidor HTTP do IIS é uma implementação de servidor em processo do IIS que converte a solicitação de nativa para gerenciada.

Após o servidor HTTP do IIS processar a solicitação:

  1. A solicitação é enviada para o pipeline de middleware do ASP.NET Core.
  2. O pipeline do middleware manipula a solicitação e a passa como uma instância de HttpContext para a lógica do aplicativo.
  3. A resposta do aplicativo é retornada ao IIS por meio do Servidor HTTP do IIS.
  4. O IIS enviará a resposta ao cliente que iniciou a solicitação.

CreateDefaultBuilder adiciona uma instância de IServer chamando o método UseIIS para inicializar o CoreCLR e hospedar o aplicativo no processo de trabalho do IIS (w3wp.exe ou iisexpress.exe). Os testes de desempenho indicam que hospedar um aplicativo em processo do .NET Core oferece uma de taxa de transferência de solicitação significativamente mais elevada em comparação a hospedar o aplicativo fora do processo e enviar por proxy as solicitações para o Kestrel.

Aplicativos publicados como um único arquivo executável não podem ser carregados pelo modelo de hospedagem em processo.

Configuração de aplicativo

Para configurar opções do IIS, inclua uma configuração de serviço para IISServerOptions em ConfigureServices. O exemplo a seguir desabilita AutomaticAuthentication:

services.Configure<IISServerOptions>(options => 
{
    options.AutomaticAuthentication = false;
});
Opção Padrão Configuração
AutomaticAuthentication true Se true, o Servidor do IIS define o HttpContext.User autenticado pela Autenticação do Windows. Se false, o servidor fornecerá apenas uma identidade para HttpContext.User e responderá a desafios quando explicitamente solicitado pelo AuthenticationScheme. A autenticação do Windows deve estar habilitada no IIS para que o AutomaticAuthentication funcione. Para obter mais informações, confira Autenticação do Windows.
AuthenticationDisplayName null Configura o nome de exibição mostrado aos usuários em páginas de logon.
AllowSynchronousIO false Se a E/S síncrona é permitida para o HttpContext.Request e o HttpContext.Response.
MaxRequestBodySize 30000000 Obtém ou define o tamanho máximo do corpo da solicitação para o HttpRequest. Observe que o próprio IIS tem o limite maxAllowedContentLength que será processado antes de MaxRequestBodySize definido no IISServerOptions. Alterar MaxRequestBodySize não afetará maxAllowedContentLength. Para aumentar maxAllowedContentLength, adicione uma entrada a web.config para definir maxAllowedContentLength como um valor mais alto. Para obter mais detalhes, confira Configuração.

Diferenças entre hospedagem em processo e fora do processo

As seguintes características se aplicam ao hospedar em processo:

  • O servidor HTTP do IIS (IISHttpServer) é usado em vez do servidor Kestrel. Em processo, CreateDefaultBuilder chama UseIIS para:

    • Registrar o IISHttpServer.
    • Configurar a porta e o caminho base nos quais o servidor deve escutar ao ser executado por trás do Módulo do ASP.NET Core.
    • Configurar o host para capturar erros de inicialização.
  • O atributo requestTimeout não se aplica à hospedagem em processo.

  • Não há suporte para o compartilhamento do pool de aplicativos entre aplicativos. Use um pool de aplicativos por aplicativo.

  • A arquitetura (número de bit) do aplicativo e o runtime instalado (x64 ou x86) devem corresponder à arquitetura do pool de aplicativos. Por exemplo, aplicativos publicados para 32 bits (x86) devem ter a opção de 32 bits habilitada para os Pools de Aplicativos do IIS. Para obter mais informações, consulte a seção Criar o site do IIS.

  • As desconexões do cliente são detectadas. O token de cancelamento HttpContext.RequestAborted é cancelado quando o cliente se desconecta.

  • Ao hospedar em processo, AuthenticateAsync não é chamado internamente para inicializar um usuário. Portanto, uma implementação IClaimsTransformation usada para transformar as declarações após cada autenticação não é ativada por padrão. Quando a transformação de declarações com uma implementação IClaimsTransformation, chame AddAuthentication para adicionar serviços de autenticação:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient<IClaimsTransformation, ClaimsTransformer>();
        services.AddAuthentication(IISServerDefaults.AuthenticationScheme);
    }
    
    public void Configure(IApplicationBuilder app)
    {
        app.UseAuthentication();
    }
    
  • Não há suporte para implantações de implantar (arquivo único).