Hostowanie procesów za pomocą usług IIS i ASP.NET Core

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:

ASP.NET Core Module in the in-process hosting scenario

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:

  1. Żądanie jest dostarczane z Internetu do sterownika HTTP.sys trybu jądra.
  2. Sterownik kieruje żądanie natywne do usług IIS na skonfigurowanym porcie witryny internetowej, zazwyczaj 80 (HTTP) lub 443 (HTTPS).
  3. 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:

  1. Żądanie jest wysyłane do potoku oprogramowania pośredniczącego ASP.NET Core.
  2. Potok oprogramowania pośredniczącego obsługuje żądanie i przekazuje je jako wystąpienie obiektu HttpContext do logiki aplikacji.
  3. Odpowiedź aplikacji jest przekazywana z powrotem do usług IIS za pośrednictwem serwera HTTP usług IIS.
  4. 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 Domyślna Ustawienie
AutomaticAuthentication true Jeśli true, program IIS Server ustawia HttpContext.User uwierzytelnione przez uwierzytelnianie systemu Windows. Jeśli false, serwer tylko udostępnia tożsamość HttpContext.User i odpowiada na wyzwania, gdy jest jawnie żądany przez 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 procesu CreateDefaultBuilder 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.
  • 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ę IClaimsTransformationAddAuthentication , 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.

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:

ASP.NET Core Module in the in-process hosting scenario

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:

  1. Żądanie jest dostarczane z Internetu do sterownika HTTP.sys trybu jądra.
  2. Sterownik kieruje żądanie natywne do usług IIS na skonfigurowanym porcie witryny internetowej, zazwyczaj 80 (HTTP) lub 443 (HTTPS).
  3. 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:

  1. Żądanie jest wysyłane do potoku oprogramowania pośredniczącego ASP.NET Core.
  2. Potok oprogramowania pośredniczącego obsługuje żądanie i przekazuje je jako wystąpienie obiektu HttpContext do logiki aplikacji.
  3. Odpowiedź aplikacji jest przekazywana z powrotem do usług IIS za pośrednictwem serwera HTTP usług IIS.
  4. 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 Domyślna Ustawienie
AutomaticAuthentication true Jeśli true, program IIS Server ustawia HttpContext.User uwierzytelnione przez uwierzytelnianie systemu Windows. Jeśli false, serwer tylko udostępnia tożsamość HttpContext.User i odpowiada na wyzwania, gdy jest jawnie żądany przez 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 procesu CreateDefaultBuilder 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.
  • 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ę IClaimsTransformationAddAuthentication , 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.