Partilhar via


Hospedagem em processo com IIS e ASP.NET Core

Observação

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

Advertência

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 9 deste artigo.

Importante

Estas informações referem-se a um produto de pré-lançamento que pode ser substancialmente modificado antes de ser lançado comercialmente. A Microsoft não oferece garantias, expressas ou implícitas, em relação às informações fornecidas aqui.

Para a versão atual, consulte a versão .NET 9 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 em processo um aplicativo .NET Core proporciona uma taxa de transferência de solicitações significativamente maior em comparação com a hospedagem do aplicativo fora do processo e o redirecionamento de 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 do aplicativo

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();
Opção Padrão Cenário
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();

A hospedagem "in-process" executa uma aplicação ASP.NET Core no mesmo processo que o processo de trabalho do IIS. A hospedagem no processo oferece um melhor desempenho em comparação com a hospedagem fora do processo, pois as solicitações não são redirecionadas pelo adaptador de loopback, uma interface de rede que devolve o tráfego de rede de saída à 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. Uma solicitação chega da web para o 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 Core em processo interno oferece uma taxa de transferência de solicitações significativamente maior em comparação com a hospedagem do aplicativo fora do processo e enviar as solicitações por proxy para Kestrel.

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

Configuração do aplicativo

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;
});
Opção Padrão Cenário
AutomaticAuthentication true Se true, o Servidor IIS define o HttpContext.User autenticado por Autenticação do Windows . Se false, o servidor apenas fornece 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 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 se aplicam ao hospedar em processo:

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

    • Registe o IISHttpServer.
    • Configure a porta e o caminho base que o servidor deve escutar ao executar atrás 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 dentro do processo, AuthenticateAsync não é chamado internamente para inicializar um utilizador. 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();
    }
    
  • implantações de pacote da Web (arquivo único) não são suportadas.