Hospedagem em processo com IIS e ASP.NET Core
Observação
Esta não é a versão mais recente deste artigo. Para informações sobre a versão vigente, confira a Versão do .NET 8 deste artigo.
Aviso
Esta versão do ASP.NET Core não tem mais suporte. Para obter mais informações, confira .NET e a Política de Suporte do .NET Core. Para informações sobre a versão vigente, confira a Versão do .NET 8 deste artigo.
Importante
Essas informações relacionam-se ao produto de pré-lançamento, que poderá ser substancialmente modificado antes do lançamento comercial. A Microsoft não oferece nenhuma garantia, explícita ou implícita, quanto às informações fornecidas aqui.
Para informações sobre a versão vigente, confira a Versão do .NET 8 deste artigo.
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:
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:
- A solicitação chega da Web para o driver do HTTP.sys no modo kernel.
- O driver roteia as solicitações nativas ao IIS na porta configurada do site, normalmente, a 80 (HTTP) ou a 443 (HTTPS).
- 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:
- A solicitação é enviada para o pipeline de middleware do ASP.NET Core.
- O pipeline do middleware manipula a solicitação e a passa como uma instância de
HttpContext
para a lógica do aplicativo. - A resposta do aplicativo é retornada ao IIS por meio do Servidor HTTP do IIS.
- 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 identity 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.
- Registrar 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();
- Não há suporte para implantações de implantar (arquivo único).
Obter informações de tempo
Veja Obtenha informações detalhadas de tempo com IHttpSysRequestTimingFeature.
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:
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:
- A solicitação chega da Web para o driver do HTTP.sys no modo kernel.
- O driver roteia as solicitações nativas ao IIS na porta configurada do site, normalmente, a 80 (HTTP) ou a 443 (HTTPS).
- 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:
- A solicitação é enviada para o pipeline de middleware do ASP.NET Core.
- O pipeline do middleware manipula a solicitação e a passa como uma instância de
HttpContext
para a lógica do aplicativo. - A resposta do aplicativo é retornada ao IIS por meio do Servidor HTTP do IIS.
- 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 identity 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.
- Registrar 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).