Hostování v procesu se službou IIS a ASP.NET Core

Poznámka:

Toto není nejnovější verze tohoto článku. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

Upozorňující

Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v tématu .NET a .NET Core Zásady podpory. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

Důležité

Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.

Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

Hostování v procesu spouští aplikaci ASP.NET Core ve stejném procesu jako pracovní proces služby IIS. Vnitroprocesové hostování nabízí oproti mimoprocesovému hostování vyšší výkon, protože požadavky neprocházejí přes proxy v podobě adaptéru zpětné smyčky, což je síťové rozhraní, které vrací odchozí síťový provoz zpět do stejného počítače.

Následující diagram znázorňuje vztah mezi službou IIS, modulem ASP.NET Core a vnitroprocesově hostovanou aplikací:

Modul ASP.NET Core ve scénáři vnitroprocesového hostování

Povolení hostování v procesu

Od ASP.NET Core 3.0 je ve výchozím nastavení povolené hostování v procesu pro všechny aplikace nasazené ve službě IIS.

Pokud chcete explicitně nakonfigurovat aplikaci pro hostování v procesu, nastavte hodnotu <AspNetCoreHostingModel> vlastnosti do InProcess souboru projektu (.csproj):

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

Obecná architektura

Obecný tok požadavku je následující:

  1. Požadavek přijde z webu do ovladače HTTP.sys v režimu jádra.
  2. Ovladač přesměruje nativní požadavek do služby IIS na nakonfigurovaném portu webu, obvykle 80 (HTTP) nebo 443 (HTTPS).
  3. Modul ASP.NET Core přijme nativní požadavek a předá ho serveru HTTP služby IIS (IISHttpServer). Server HTTP služby IIS představuje implementaci vnitroprocesového serveru pro službu IIS, který převede požadavek z nativního na spravovaný.

Po zpracování požadavku serverem HTTP služby IIS:

  1. Požadavek se odešle do kanálu middlewaru ASP.NET Core.
  2. Kanál middlewaru požadavek zpracuje a předá ho jako instanci HttpContext do logiky aplikace.
  3. Odpověď aplikace se předá zpět do služby IIS prostřednictvím serveru HTTP služby IIS.
  4. Služba IIS odešle odpověď klientovi, který požadavek inicioval.

CreateDefaultBuilder přidá instanci IServer zavoláním metody UseIIS, která spustí CoreCLR a zahájí hostování aplikace v rámci pracovního procesu služby IIS (w3wp.exe nebo iisexpress.exe). Testy výkonnosti ukazují, že vnitroprocesové hostování aplikací .NET Core přináší výrazně vyšší propustnost v porovnání s mimoprocesovým hostováním aplikací a odesíláním požadavků na proxy server Kestrel.

Model vnitroprocesového hostování nedokáže načíst aplikace publikované jako jednotlivé spustitelné soubory.

Konfigurace aplikací

Pokud chcete nakonfigurovat možnosti služby IIS, vložte konfiguraci služby pro třídu IISServerOptions do souboru Program.cs. Následující příklad zakáže 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();
Možnost Výchozí Nastavení
AutomaticAuthentication true Pokud je nastavená hodnota true, server služby IIS nastaví objekt HttpContext.User, který se ověřuje pomocí Integrovaného ověřování Windows. Pokud falseserver poskytuje identity pouze výzvu HttpContext.User a reaguje na výzvy, pokud je AuthenticationSchemevýslovně požaduje . Aby fungovala možnost AutomaticAuthentication, ve službě IIS musí být povolené Integrované ověřování Windows. Další informace najdete v tématu Integrované ověřování Windows.
AuthenticationDisplayName null Nastaví zobrazovaný název, který se zobrazí uživatelům na přihlašovacích stránkách.
AllowSynchronousIO false Určuje, jestli jsou pro HttpContext.Request a HttpContext.Response povolené synchronní vstupně-výstupní operace.
MaxRequestBodySize 30000000 Získá nebo nastaví maximální velikost textu požadavku pro HttpRequest. Upozorňujeme, že služba IIS má vlastní limit maxAllowedContentLength, který se vyhodnocuje před limitem MaxRequestBodySize nastaveným v IISServerOptions. Změna hodnoty MaxRequestBodySize nemá vliv na hodnotu maxAllowedContentLength. Pokud chcete zvýšit hodnotu maxAllowedContentLength, přidejte položku do souboru web.config a nastavte vyšší hodnotu maxAllowedContentLength. Další podrobnosti najdete v části Konfigurace.

Rozdíly mezi hostování v procesu a hostování mimo proces

Při hostování v procesu platí následující charakteristiky:

  • Server HTTP služby IIS (IISHttpServer) se používá místo Kestrel serveru. V případě procesu CreateDefaultBuilder volání UseIIS na:

    • Zaregistrujte .IISHttpServer
    • Nakonfigurujte port a základní cestu, na které by měl server naslouchat při spuštění za modulem ASP.NET Core.
    • Nakonfigurujte hostitele tak, aby zachytil chyby při spuštění.
  • Atribut requestTimeout se nevztahuje na hostování v procesu.

  • Sdílení fondu aplikací mezi aplikacemi se nepodporuje. Pro každou aplikaci použijte jeden fond aplikací.

  • Architektura (bitová verze) aplikace a nainstalovaného modulu runtime (x64 nebo x86) musí odpovídat architektuře fondu aplikací. Například aplikace publikované pro 32bitovou verzi (x86) musí mít pro fondy aplikací služby IIS povoleno 32bitovou verzi. Další informace najdete v části Vytvoření webu služby IIS.

  • Zjistí se odpojení klienta. Token HttpContext.RequestAborted zrušení se zruší, když se klient odpojí.

  • Při hostování v procesu se nevolá interně za AuthenticateAsync účelem inicializace uživatele. Proto se implementace použitá IClaimsTransformation k transformaci deklarací identity po každém ověření ve výchozím nastavení neaktivuje. Při transformaci deklarací identity pomocí IClaimsTransformation implementace volání AddAuthentication pro přidání ověřovacích služeb:

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();
  • Nasazení webového balíčku (s jedním souborem) se nepodporují.

Hostování v procesu spouští aplikaci ASP.NET Core ve stejném procesu jako pracovní proces služby IIS. Vnitroprocesové hostování nabízí oproti mimoprocesovému hostování vyšší výkon, protože požadavky neprocházejí přes proxy v podobě adaptéru zpětné smyčky, což je síťové rozhraní, které vrací odchozí síťový provoz zpět do stejného počítače.

Následující diagram znázorňuje vztah mezi službou IIS, modulem ASP.NET Core a vnitroprocesově hostovanou aplikací:

Modul ASP.NET Core ve scénáři vnitroprocesového hostování

Povolení hostování v procesu

Od ASP.NET Core 3.0 je ve výchozím nastavení povolené hostování v procesu pro všechny aplikace nasazené ve službě IIS.

Pokud chcete explicitně nakonfigurovat aplikaci pro hostování v procesu, nastavte hodnotu <AspNetCoreHostingModel> vlastnosti do InProcess souboru projektu (.csproj):

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

Obecná architektura

Obecný tok požadavku je následující:

  1. Požadavek přijde z webu do ovladače HTTP.sys v režimu jádra.
  2. Ovladač přesměruje nativní požadavek do služby IIS na nakonfigurovaném portu webu, obvykle 80 (HTTP) nebo 443 (HTTPS).
  3. Modul ASP.NET Core přijme nativní požadavek a předá ho serveru HTTP služby IIS (IISHttpServer). Server HTTP služby IIS představuje implementaci vnitroprocesového serveru pro službu IIS, který převede požadavek z nativního na spravovaný.

Po zpracování požadavku serverem HTTP služby IIS:

  1. Požadavek se odešle do kanálu middlewaru ASP.NET Core.
  2. Kanál middlewaru požadavek zpracuje a předá ho jako instanci HttpContext do logiky aplikace.
  3. Odpověď aplikace se předá zpět do služby IIS prostřednictvím serveru HTTP služby IIS.
  4. Služba IIS odešle odpověď klientovi, který požadavek inicioval.

CreateDefaultBuilder přidá instanci IServer zavoláním metody UseIIS, která spustí CoreCLR a zahájí hostování aplikace v rámci pracovního procesu služby IIS (w3wp.exe nebo iisexpress.exe). Testy výkonnosti ukazují, že vnitroprocesové hostování aplikací .NET Core přináší výrazně vyšší propustnost v porovnání s mimoprocesovým hostováním aplikací a odesíláním požadavků na proxy server Kestrel.

Model vnitroprocesového hostování nedokáže načíst aplikace publikované jako jednotlivé spustitelné soubory.

Konfigurace aplikací

Pokud chcete nakonfigurovat možnosti služby IIS, vložte konfiguraci služby pro třídu IISServerOptions do souboru ConfigureServices. Následující příklad zakáže vlastnost AutomaticAuthentication:

services.Configure<IISServerOptions>(options => 
{
    options.AutomaticAuthentication = false;
});
Možnost Výchozí Nastavení
AutomaticAuthentication true Pokud je nastavená hodnota true, server služby IIS nastaví objekt HttpContext.User, který se ověřuje pomocí Integrovaného ověřování Windows. Pokud falseserver poskytuje identity pouze výzvu HttpContext.User a reaguje na výzvy, pokud je AuthenticationSchemevýslovně požaduje . Aby fungovala možnost AutomaticAuthentication, ve službě IIS musí být povolené Integrované ověřování Windows. Další informace najdete v tématu Integrované ověřování Windows.
AuthenticationDisplayName null Nastaví zobrazovaný název, který se zobrazí uživatelům na přihlašovacích stránkách.
AllowSynchronousIO false Určuje, jestli jsou pro HttpContext.Request a HttpContext.Response povolené synchronní vstupně-výstupní operace.
MaxRequestBodySize 30000000 Získá nebo nastaví maximální velikost textu požadavku pro HttpRequest. Upozorňujeme, že služba IIS má vlastní limit maxAllowedContentLength, který se vyhodnocuje před limitem MaxRequestBodySize nastaveným v IISServerOptions. Změna hodnoty MaxRequestBodySize nemá vliv na hodnotu maxAllowedContentLength. Pokud chcete zvýšit hodnotu maxAllowedContentLength, přidejte položku do souboru web.config a nastavte vyšší hodnotu maxAllowedContentLength. Další podrobnosti najdete v části Konfigurace.

Rozdíly mezi hostování v procesu a hostování mimo proces

Při hostování v procesu platí následující charakteristiky:

  • Server HTTP služby IIS (IISHttpServer) se používá místo Kestrel serveru. V případě procesu CreateDefaultBuilder volání UseIIS na:

    • Zaregistrujte .IISHttpServer
    • Nakonfigurujte port a základní cestu, na které by měl server naslouchat při spuštění za modulem ASP.NET Core.
    • Nakonfigurujte hostitele tak, aby zachytil chyby při spuštění.
  • Atribut requestTimeout se nevztahuje na hostování v procesu.

  • Sdílení fondu aplikací mezi aplikacemi se nepodporuje. Pro každou aplikaci použijte jeden fond aplikací.

  • Architektura (bitová verze) aplikace a nainstalovaného modulu runtime (x64 nebo x86) musí odpovídat architektuře fondu aplikací. Například aplikace publikované pro 32bitovou verzi (x86) musí mít pro fondy aplikací služby IIS povoleno 32bitovou verzi. Další informace najdete v části Vytvoření webu služby IIS.

  • Zjistí se odpojení klienta. Token HttpContext.RequestAborted zrušení se zruší, když se klient odpojí.

  • Při hostování v procesu se nevolá interně za AuthenticateAsync účelem inicializace uživatele. Proto se implementace použitá IClaimsTransformation k transformaci deklarací identity po každém ověření ve výchozím nastavení neaktivuje. Při transformaci deklarací identity pomocí IClaimsTransformation implementace volání AddAuthentication pro přidání ověřovacích služeb:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient<IClaimsTransformation, ClaimsTransformer>();
        services.AddAuthentication(IISServerDefaults.AuthenticationScheme);
    }
    
    public void Configure(IApplicationBuilder app)
    {
        app.UseAuthentication();
    }
    
  • Nasazení webového balíčku (s jedním souborem) se nepodporují.