Partilhar via


Hospedagem em processo com IIS e ASP.NET Core

Note

Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 10 deste artigo.

Warning

Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e .NET Core. Para a versão atual, consulte a versão .NET 10 deste artigo.

A hospedagem em processo executa um aplicativo ASP.NET Core no mesmo processo que seu processo de trabalho do IIS. A hospedagem em processo oferece melhor desempenho em relação à hospedagem fora do processo porque as solicitações não são intermediadas por proxy pelo adaptador de loopback, uma interface de rede que retorna o tráfego de rede de saída de volta para a mesma máquina.

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

Módulo ASP.NET Core no cenário de hospedagem em processo

Ativar hospedagem em processo

Desde o 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 um pedido é o seguinte:

  1. Um pedido chega da web ao driver HTTP.sys em modo kernel.
  2. O driver roteia a solicitação nativa para o IIS na porta configurada do site, geralmente 80 (HTTP) ou 443 (HTTPS).
  3. O ASP.NET Core Module recebe a solicitação nativa e a passa para o IIS HTTP Server (IISHttpServer). O Servidor HTTP do IIS é uma implementação de servidor em processo para o IIS que converte a solicitação de nativa para gerenciada.

Depois que o servidor HTTP do IIS processa a solicitação:

  1. A solicitação é enviada para o pipeline de middleware ASP.NET Core.
  2. O pipeline de middleware lida com a solicitação e a transmite como uma instância HttpContext para a lógica da aplicação.
  3. A resposta do aplicativo é passada de volta para o IIS por meio do Servidor HTTP do IIS.
  4. O IIS envia a resposta para o cliente que iniciou a solicitação.

CreateDefaultBuilder adiciona uma instância IServer chamando o método UseIIS para inicializar o CoreCLR e hospedar o aplicativo dentro do processo de trabalho do IIS (w3wp.exe ou iisexpress.exe). Os testes de desempenho indicam que hospedar um aplicativo .NET em modo de processamento interno oferece uma taxa de transferência de solicitações significativamente maior em comparação com hospedar o aplicativo em processo externo e fazer proxy das solicitações para Kestrel.

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

Configuração da aplicação

Para configurar as opções do IIS, inclua uma configuração de serviço para IISServerOptions no Program.cs. O exemplo seguinte desativa 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();
Option Default Setting
AutomaticAuthentication true Se true, o Servidor IIS define o HttpContext.User autenticado por de Autenticação do Windows. Se false, o servidor fornece apenas uma identidade para HttpContext.User e responde a desafios quando solicitado explicitamente pelo AuthenticationScheme. A Autenticação do Windows deve estar habilitada no IIS para que AutomaticAuthentication funcione. Para obter mais informações, consulte Autenticação do Windows.
AuthenticationDisplayName null Define o nome para exibição mostrado aos usuários nas páginas de login.
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 que o MaxRequestBodySize definido no IISServerOptions. Alterar o MaxRequestBodySize não afetará o maxAllowedContentLength. Para aumentar maxAllowedContentLength, adicione uma entrada no web.config para definir maxAllowedContentLength para um valor mais alto. Para obter mais detalhes, consulte Configuration.

Diferenças entre hospedagem em processo e fora de processo

As seguintes características aplicam-se à hospedagem em processo:

  • Servidor HTTP do IIS (IISHttpServer) é usado em vez de Kestrel servidor. Durante o processo, CreateDefaultBuilder liga para UseIIS para:

    • Registe o IISHttpServer.
    • Configure a porta e o caminho base que o servidor deve ouvir quando executado com o auxílio do ASP.NET Core Module.
    • Configure 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 de um pool de aplicativos entre aplicativos. Use um pool de aplicativos por aplicativo.

  • A arquitetura (bitness) do aplicativo e o tempo de execução instalado (x64 ou x86) devem corresponder à arquitetura do pool de aplicativos. Por exemplo, os aplicativos publicados para 32 bits (x86) devem ter 32 bits habilitados para seus 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 detetadas. 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 de IClaimsTransformation usada para transformar declarações após cada autenticação não é ativada por padrão. Ao transformar 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();

Obter informações sobre cronometragem

Consulte Obtenha informações detalhadas sobre o tempo com IHttpSysRequestTimingFeature.

A hospedagem em processo executa um aplicativo ASP.NET Core no mesmo processo que seu processo de trabalho do IIS. A hospedagem em processo oferece melhor desempenho em relação à hospedagem fora do processo porque as solicitações não são intermediadas por proxy pelo adaptador de loopback, uma interface de rede que retorna o tráfego de rede de saída de volta para a mesma máquina.

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

Módulo ASP.NET Core no cenário de hospedagem em processo

Ativar hospedagem em processo

Desde o 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 um pedido é o seguinte:

  1. Um pedido chega da web ao driver HTTP.sys em modo kernel.
  2. O driver roteia a solicitação nativa para o IIS na porta configurada do site, geralmente 80 (HTTP) ou 443 (HTTPS).
  3. O ASP.NET Core Module recebe a solicitação nativa e a passa para o IIS HTTP Server (IISHttpServer). O Servidor HTTP do IIS é uma implementação de servidor em processo para o IIS que converte a solicitação de nativa para gerenciada.

Depois que o servidor HTTP do IIS processa a solicitação:

  1. A solicitação é enviada para o pipeline de middleware ASP.NET Core.
  2. O pipeline de middleware lida com a solicitação e a transmite como uma instância HttpContext para a lógica da aplicação.
  3. A resposta do aplicativo é passada de volta para o IIS por meio do Servidor HTTP do IIS.
  4. O IIS envia a resposta para o cliente que iniciou a solicitação.

CreateDefaultBuilder adiciona uma instância IServer chamando o método UseIIS para inicializar o CoreCLR e hospedar o aplicativo dentro do processo de trabalho do IIS (w3wp.exe ou iisexpress.exe). Os testes de desempenho indicam que hospedar um aplicativo .NET em modo de processamento interno oferece uma taxa de transferência de solicitações significativamente maior em comparação com hospedar o aplicativo em processo externo e fazer proxy das solicitações para Kestrel.

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

Configuração da aplicação

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

services.Configure<IISServerOptions>(options => 
{
    options.AutomaticAuthentication = false;
});
Option Default Setting
AutomaticAuthentication true Se true, o Servidor IIS define o HttpContext.User autenticado por de Autenticação do Windows. Se false, o servidor fornece apenas uma identidade para HttpContext.User e responde a desafios quando solicitado explicitamente pelo AuthenticationScheme. A Autenticação do Windows deve estar habilitada no IIS para que AutomaticAuthentication funcione. Para obter mais informações, consulte Autenticação do Windows.
AuthenticationDisplayName null Define o nome para exibição mostrado aos usuários nas páginas de login.
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 que o MaxRequestBodySize definido no IISServerOptions. Alterar o MaxRequestBodySize não afetará o maxAllowedContentLength. Para aumentar maxAllowedContentLength, adicione uma entrada no web.config para definir maxAllowedContentLength para um valor mais alto. Para obter mais detalhes, consulte Configuration.

Diferenças entre hospedagem em processo e fora de processo

As seguintes características aplicam-se à hospedagem em processo:

  • Servidor HTTP do IIS (IISHttpServer) é usado em vez de Kestrel servidor. Durante o processo, CreateDefaultBuilder liga para UseIIS para:

    • Registe o IISHttpServer.
    • Configure a porta e o caminho base que o servidor deve ouvir quando executado com o auxílio do ASP.NET Core Module.
    • Configure 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 de um pool de aplicativos entre aplicativos. Use um pool de aplicativos por aplicativo.

  • A arquitetura (bitness) do aplicativo e o tempo de execução instalado (x64 ou x86) devem corresponder à arquitetura do pool de aplicativos. Por exemplo, os aplicativos publicados para 32 bits (x86) devem ter 32 bits habilitados para seus 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 detetadas. 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 de IClaimsTransformation usada para transformar declarações após cada autenticação não é ativada por padrão. Ao transformar 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();
    }
    
  • As implantações de pacotes Web (arquivo único) não são suportadas.