Hostowanie procesów za pomocą usług IIS i ASP.NET Core
Uwaga
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.
Ważne
Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.
Hosting w procesie uruchamia aplikację ASP.NET Core w tym samym procesie co proces roboczy usług IIS. Hosting wewnątrz procesu zapewnia lepszą wydajność niż hosting poza procesem, ponieważ żądania nie są przekazywane za pośrednictwem adaptera sprzężenia zwrotnego, czyli interfejsu sieciowego przekazującego wychodzący ruch sieciowy z powrotem do tej samej maszyny.
Na poniższym diagramie przedstawiono relację między usługami IIS, modułem ASP.NET Core Module i aplikacją hostowaną wewnątrz procesu:
Włączanie hostingu w procesie
Od ASP.NET Core 3.0 hosting w procesie jest domyślnie włączony dla wszystkich aplikacji wdrożonych w usługach IIS.
Aby jawnie skonfigurować aplikację do hostowania w procesie, ustaw wartość <AspNetCoreHostingModel>
właściwości na InProcess
w pliku projektu (.csproj
):
<PropertyGroup>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>
Architektura ogólna
Ogólny przepływ żądania jest następujący:
- Żądanie jest dostarczane z Internetu do sterownika HTTP.sys trybu jądra.
- Sterownik kieruje żądanie natywne do usług IIS na skonfigurowanym porcie witryny internetowej, zazwyczaj 80 (HTTP) lub 443 (HTTPS).
- Moduł ASP.NET Core Module odbiera żądanie natywne i przekazuje je do serwera HTTP usług IIS (
IISHttpServer
). Serwer HTTP usług IIS to implementacja serwera przetwarzania wewnątrz procesu dla usług IIS, która konwertuje żądanie z natywnego na zarządzane.
Po zakończeniu przetwarzania żądania przez serwer HTTP usług IIS:
- Żądanie jest wysyłane do potoku oprogramowania pośredniczącego ASP.NET Core.
- Potok oprogramowania pośredniczącego obsługuje żądanie i przekazuje je jako wystąpienie obiektu
HttpContext
do logiki aplikacji. - Odpowiedź aplikacji jest przekazywana z powrotem do usług IIS za pośrednictwem serwera HTTP usług IIS.
- Usługi IIS wysyłają odpowiedź do klienta, który zainicjował żądanie.
CreateDefaultBuilder
dodaje wystąpienie IServer, wywołując metodę UseIIS, aby uruchomić moduł CoreCLR i hostować aplikację wewnątrz procesu roboczego usług IIS (w3wp.exe
lub iisexpress.exe
). Testy wydajności wskazują, że hostowanie aplikacji .NET Core wewnątrz procesu zapewnia znacznie większą przepływność żądań w porównaniu z hostowaniem żądań poza procesem aplikacji i żądaniami proxy do usługi Kestrel.
Aplikacje opublikowane jako pojedynczy plik wykonywalny nie mogą być ładowane przez model hostingu wewnątrz procesu.
Konfiguracja aplikacji
Aby skonfigurować opcje usług IIS, dołącz konfigurację usługi dla IISServerOptions w Program.cs
. Poniższy przykład wyłącza funkcję 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();
Opcja | Wartość domyślna | Ustawienie |
---|---|---|
AutomaticAuthentication |
true |
Jeśli true , program IIS Server ustawia HttpContext.User uwierzytelnione przez uwierzytelnianie systemu Windows. Jeśli false serwer udostępnia identity HttpContext.User element i reaguje tylko na wyzwania, gdy żądanie jest jawnie żądane przez usługę AuthenticationScheme . Uwierzytelnianie systemu Windows musi być włączone w usługach IIS, aby AutomaticAuthentication działała. Aby uzyskać więcej informacji, zobacz Uwierzytelnianie systemu Windows. |
AuthenticationDisplayName |
null |
Ustawia nazwę wyświetlaną pokazywaną użytkownikom na stronach logowania. |
AllowSynchronousIO |
false |
Czy synchroniczne operacje we/wy są dozwolone dla elementu HttpContext.Request i HttpContext.Response . |
MaxRequestBodySize |
30000000 |
Pobiera lub ustawia maksymalny rozmiar treści żądania dla elementu HttpRequest . Należy pamiętać, że same usługi IIS mają limit maxAllowedContentLength , który zostanie przetworzony przed ustawieniem MaxRequestBodySize w elemencie IISServerOptions . Zmiana MaxRequestBodySize nie wpłynie na element maxAllowedContentLength . Aby zwiększyć wartość maxAllowedContentLength , dodaj wpis w web.config , aby ustawić maxAllowedContentLength na wyższą wartość. Aby uzyskać więcej informacji, zobacz pozycję Konfiguracja. |
Różnice między hostingu procesów i poza procesem
Podczas hostowania w procesie obowiązują następujące cechy:
Serwer HTTP usług IIS (
IISHttpServer
) jest używany zamiast Kestrel serwera. W przypadku procesuCreateDefaultBuilder
wywołania UseIIS metody :- Zarejestruj plik
IISHttpServer
. - Skonfiguruj port i ścieżkę podstawową, na którym serwer powinien nasłuchiwać podczas uruchamiania za modułem ASP.NET Core.
- Skonfiguruj hosta do przechwytywania błędów uruchamiania.
- Zarejestruj plik
Atrybut
requestTimeout
nie ma zastosowania do hostingu w procesie.Udostępnianie puli aplikacji między aplikacjami nie jest obsługiwane. Użyj jednej puli aplikacji na aplikację.
Architektura (bitowość) aplikacji i zainstalowane środowisko uruchomieniowe (x64 lub x86) musi być zgodne z architekturą puli aplikacji. Na przykład aplikacje opublikowane dla 32-bitowych (x86) muszą mieć włączone 32-bitowe pule aplikacji usług IIS. Aby uzyskać więcej informacji, zobacz sekcję Tworzenie witryny usług IIS.
Wykryto rozłączenia klienta. Token
HttpContext.RequestAborted
anulowania jest anulowany po rozłączeniu klienta.W przypadku hostowania procesu nie jest wywoływana wewnętrznie, AuthenticateAsync aby zainicjować użytkownika. W związku z tym implementacja IClaimsTransformation używana do przekształcania oświadczeń po każdym uwierzytelnieniu nie jest domyślnie aktywowana. Podczas przekształcania oświadczeń przy użyciu implementacji wywołaj metodę IClaimsTransformation AddAuthentication , aby dodać usługi uwierzytelniania:
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();
- Wdrożenia pakietu internetowego (pojedynczego pliku) nie są obsługiwane.
Uzyskiwanie informacji o chronometrażu
Zobacz Uzyskiwanie szczegółowych informacji o chronometrażu za pomocą funkcji IHttpSysRequestTimingFeature.
Hosting w procesie uruchamia aplikację ASP.NET Core w tym samym procesie co proces roboczy usług IIS. Hosting wewnątrz procesu zapewnia lepszą wydajność niż hosting poza procesem, ponieważ żądania nie są przekazywane za pośrednictwem adaptera sprzężenia zwrotnego, czyli interfejsu sieciowego przekazującego wychodzący ruch sieciowy z powrotem do tej samej maszyny.
Na poniższym diagramie przedstawiono relację między usługami IIS, modułem ASP.NET Core Module i aplikacją hostowaną wewnątrz procesu:
Włączanie hostingu w procesie
Od ASP.NET Core 3.0 hosting w procesie jest domyślnie włączony dla wszystkich aplikacji wdrożonych w usługach IIS.
Aby jawnie skonfigurować aplikację do hostowania w procesie, ustaw wartość <AspNetCoreHostingModel>
właściwości na InProcess
w pliku projektu (.csproj
):
<PropertyGroup>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>
Architektura ogólna
Ogólny przepływ żądania jest następujący:
- Żądanie jest dostarczane z Internetu do sterownika HTTP.sys trybu jądra.
- Sterownik kieruje żądanie natywne do usług IIS na skonfigurowanym porcie witryny internetowej, zazwyczaj 80 (HTTP) lub 443 (HTTPS).
- Moduł ASP.NET Core Module odbiera żądanie natywne i przekazuje je do serwera HTTP usług IIS (
IISHttpServer
). Serwer HTTP usług IIS to implementacja serwera przetwarzania wewnątrz procesu dla usług IIS, która konwertuje żądanie z natywnego na zarządzane.
Po zakończeniu przetwarzania żądania przez serwer HTTP usług IIS:
- Żądanie jest wysyłane do potoku oprogramowania pośredniczącego ASP.NET Core.
- Potok oprogramowania pośredniczącego obsługuje żądanie i przekazuje je jako wystąpienie obiektu
HttpContext
do logiki aplikacji. - Odpowiedź aplikacji jest przekazywana z powrotem do usług IIS za pośrednictwem serwera HTTP usług IIS.
- Usługi IIS wysyłają odpowiedź do klienta, który zainicjował żądanie.
CreateDefaultBuilder
dodaje wystąpienie IServer, wywołując metodę UseIIS, aby uruchomić moduł CoreCLR i hostować aplikację wewnątrz procesu roboczego usług IIS (w3wp.exe
lub iisexpress.exe
). Testy wydajności wskazują, że hostowanie aplikacji .NET Core wewnątrz procesu zapewnia znacznie większą przepływność żądań w porównaniu z hostowaniem żądań poza procesem aplikacji i żądaniami proxy do usługi Kestrel.
Aplikacje opublikowane jako pojedynczy plik wykonywalny nie mogą być ładowane przez model hostingu wewnątrz procesu.
Konfiguracja aplikacji
Aby skonfigurować opcje usług IIS, dołącz konfigurację usługi dla IISServerOptions w ConfigureServices. Poniższy przykład wyłącza funkcję AutomaticAuthentication:
services.Configure<IISServerOptions>(options =>
{
options.AutomaticAuthentication = false;
});
Opcja | Wartość domyślna | Ustawienie |
---|---|---|
AutomaticAuthentication |
true |
Jeśli true , program IIS Server ustawia HttpContext.User uwierzytelnione przez uwierzytelnianie systemu Windows. Jeśli false serwer udostępnia identity HttpContext.User element i reaguje tylko na wyzwania, gdy żądanie jest jawnie żądane przez usługę AuthenticationScheme . Uwierzytelnianie systemu Windows musi być włączone w usługach IIS, aby AutomaticAuthentication działała. Aby uzyskać więcej informacji, zobacz Uwierzytelnianie systemu Windows. |
AuthenticationDisplayName |
null |
Ustawia nazwę wyświetlaną pokazywaną użytkownikom na stronach logowania. |
AllowSynchronousIO |
false |
Czy synchroniczne operacje we/wy są dozwolone dla elementu HttpContext.Request i HttpContext.Response . |
MaxRequestBodySize |
30000000 |
Pobiera lub ustawia maksymalny rozmiar treści żądania dla elementu HttpRequest . Należy pamiętać, że same usługi IIS mają limit maxAllowedContentLength , który zostanie przetworzony przed ustawieniem MaxRequestBodySize w elemencie IISServerOptions . Zmiana MaxRequestBodySize nie wpłynie na element maxAllowedContentLength . Aby zwiększyć wartość maxAllowedContentLength , dodaj wpis w web.config , aby ustawić maxAllowedContentLength na wyższą wartość. Aby uzyskać więcej informacji, zobacz pozycję Konfiguracja. |
Różnice między hostingu procesów i poza procesem
Podczas hostowania w procesie obowiązują następujące cechy:
Serwer HTTP usług IIS (
IISHttpServer
) jest używany zamiast Kestrel serwera. W przypadku procesuCreateDefaultBuilder
wywołania UseIIS metody :- Zarejestruj plik
IISHttpServer
. - Skonfiguruj port i ścieżkę podstawową, na którym serwer powinien nasłuchiwać podczas uruchamiania za modułem ASP.NET Core.
- Skonfiguruj hosta do przechwytywania błędów uruchamiania.
- Zarejestruj plik
Atrybut
requestTimeout
nie ma zastosowania do hostingu w procesie.Udostępnianie puli aplikacji między aplikacjami nie jest obsługiwane. Użyj jednej puli aplikacji na aplikację.
Architektura (bitowość) aplikacji i zainstalowane środowisko uruchomieniowe (x64 lub x86) musi być zgodne z architekturą puli aplikacji. Na przykład aplikacje opublikowane dla 32-bitowych (x86) muszą mieć włączone 32-bitowe pule aplikacji usług IIS. Aby uzyskać więcej informacji, zobacz sekcję Tworzenie witryny usług IIS.
Wykryto rozłączenia klienta. Token
HttpContext.RequestAborted
anulowania jest anulowany po rozłączeniu klienta.W przypadku hostowania procesu nie jest wywoływana wewnętrznie, AuthenticateAsync aby zainicjować użytkownika. W związku z tym implementacja IClaimsTransformation używana do przekształcania oświadczeń po każdym uwierzytelnieniu nie jest domyślnie aktywowana. Podczas przekształcania oświadczeń przy użyciu implementacji wywołaj metodę IClaimsTransformation AddAuthentication , aby dodać usługi uwierzytelniania:
public void ConfigureServices(IServiceCollection services) { services.AddTransient<IClaimsTransformation, ClaimsTransformer>(); services.AddAuthentication(IISServerDefaults.AuthenticationScheme); } public void Configure(IApplicationBuilder app) { app.UseAuthentication(); }
Wdrożenia pakietu internetowego (pojedynczego pliku) nie są obsługiwane.