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í:
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í:
- Požadavek přijde z webu do ovladače HTTP.sys v režimu jádra.
- Ovladač přesměruje nativní požadavek do služby IIS na nakonfigurovaném portu webu, obvykle 80 (HTTP) nebo 443 (HTTPS).
- 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:
- Požadavek se odešle do kanálu middlewaru ASP.NET Core.
- Kanál middlewaru požadavek zpracuje a předá ho jako instanci
HttpContext
do logiky aplikace. - Odpověď aplikace se předá zpět do služby IIS prostřednictvím serveru HTTP služby IIS.
- 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 false server poskytuje identity pouze výzvu HttpContext.User a reaguje na výzvy, pokud je AuthenticationScheme vý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ě procesuCreateDefaultBuilder
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í.
- Zaregistrujte .
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í.
Získání informací o časování
Viz Získání podrobných informací o časování pomocí IHttpSysRequestTimingFeature.
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í:
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í:
- Požadavek přijde z webu do ovladače HTTP.sys v režimu jádra.
- Ovladač přesměruje nativní požadavek do služby IIS na nakonfigurovaném portu webu, obvykle 80 (HTTP) nebo 443 (HTTPS).
- 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:
- Požadavek se odešle do kanálu middlewaru ASP.NET Core.
- Kanál middlewaru požadavek zpracuje a předá ho jako instanci
HttpContext
do logiky aplikace. - Odpověď aplikace se předá zpět do služby IIS prostřednictvím serveru HTTP služby IIS.
- 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 false server poskytuje identity pouze výzvu HttpContext.User a reaguje na výzvy, pokud je AuthenticationScheme vý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ě procesuCreateDefaultBuilder
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í.
- Zaregistrujte .
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í.