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:
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:
- Um pedido chega da web ao driver HTTP.sys em modo kernel.
- O driver roteia a solicitação nativa para o IIS na porta configurada do site, geralmente 80 (HTTP) ou 443 (HTTPS).
- 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:
- A solicitação é enviada para o pipeline de middleware ASP.NET Core.
- O pipeline de middleware lida com a solicitação e a transmite como uma instância
HttpContext
para a lógica da aplicação. - A resposta do aplicativo é passada de volta para o IIS por meio do Servidor HTTP do IIS.
- 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.
- Registe 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();
- As implantações de pacotes Web (arquivo único) não são suportadas.
Obter informações sobre cronometragem
Consulte Obtenha informações detalhadas sobre o tempo com IHttpSysRequestTimingFeature.
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:
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:
- Uma solicitação chega da web para o driver HTTP.sys em modo kernel.
- O driver roteia a solicitação nativa para o IIS na porta configurada do site, geralmente 80 (HTTP) ou 443 (HTTPS).
- 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:
- A solicitação é enviada para o pipeline de middleware ASP.NET Core.
- O pipeline de middleware lida com a solicitação e a transmite como uma instância
HttpContext
para a lógica da aplicação. - A resposta do aplicativo é passada de volta para o IIS por meio do Servidor HTTP do IIS.
- 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, oCreateDefaultBuilder
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.
- Registe 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.