In-Process-Hosting mit IIS und ASP.NET Core

Beim Einsatz von In-Process-Hosting wird eine ASP.NET Core-App im gleichen Prozess wie ihr IIS-Workerprozess ausgeführt. Durch das In-Process-Hosting wird die Leistung des Out-of-Process-Hosting verbessert, da Anforderungen nicht per Proxy über den Loopbackadapter weitergeleitet werden. Dabei handelt es sich um eine Netzwerkschnittstelle, die ausgehenden Netzwerkdatenverkehr zum selben Computer zurück leitet.

Das folgende Diagramm zeigt die Beziehung zwischen IIS, dem ASP.NET Core-Modul und einer In-Process gehosteten App:

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

Aktivieren von In-Process-Hosting

Seit ASP.NET Core 3.0 ist In-Process-Hosting standardmäßig für alle für die IIS bereitgestellten Apps aktiviert.

Legen Sie den Wert der <AspNetCoreHostingModel>-Eigenschaft in der Projektdatei (.csproj) auf InProcess fest, um eine App explizit für In-Process-Hosting zu konfigurieren:

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

Allgemeine Architektur

Der allgemeine Anforderungsflow lautet wie folgt:

  1. Eine Anforderung geht aus dem Web beim HTTP.sys-Treiber im Kernelmodus ein.
  2. Der Treiber leitet die native Anforderung an IIS auf dem konfigurierten Port der Webseite weiter, normalerweise 80 (HTTP) oder 443 (HTTPS).
  3. Das ASP.NET Core-Modul empfängt die native Anforderung und übergibt sie an den IIS-HTTP-Server (IISHttpServer). Der IIS-HTTP-Server ist eine prozessinterne Serverimplementierung für IIS, die die Anforderung vom nativen Modus in den verwalteten Modus konvertiert.

Nach der Verarbeitung der Anforderung durch den IIS-HTTP-Server:

  1. Die Anforderung wird an die ASP.NET Core-Middlewarepipeline gesendet.
  2. Die Middleware-Pipeline behandelt die Anforderung und gibt sie als HttpContext-Instanz an die App-Logik weiter.
  3. Die Antwort der App wird über den IIS-HTTP-Server zurück an IIS übergeben.
  4. IIS übermittelt die Antwort an den Client, der die Anforderung initiiert hat.

CreateDefaultBuilder fügt eine IServer-Instanz hinzu, indem die UseIIS-Methode aufgerufen wird, um die CoreCLR zu starten und die App im IIS-Workerprozess zu hosten (w3wp.exe oder iisexpress.exe). Leistungstests weisen darauf hin, dass das In-Process-Hosting einer .NET Core-App einen weitaus höheren Anforderungsdurchsatz bietet als das Out-of-Process-Hosting der App mit Weiterleitung der Anforderungen über einen Proxy an Kestrel.

Apps, die als einzelne ausführbare Datei veröffentlicht wurden, können vom In-Prozess-Hostingmodell nicht geladen werden.

Anwendungskonfiguration

Schließen Sie zur Konfiguration von IIS-Optionen eine Dienstkonfiguration für IISServerOptions in Program.cs ein. Im folgenden Beispiel wird AutomaticAuthentication deaktiviert:

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();
Option Standard Einstellung
AutomaticAuthentication true Bei Festlegung auf true legt der Server den per Windows-Authentifizierung authentifizierten HttpContext.User fest. Bei Festlegung auf false stellt der Server nur eine Identität für HttpContext.User bereit und antwortet auf explizite Anforderungen durch AuthenticationScheme. Die Windows-Authentifizierung muss in IIS aktiviert sein, damit AutomaticAuthentication funktioniert. Weitere Informationen finden Sie unter Windows-Authentifizierung.
AuthenticationDisplayName null Legt den Anzeigename fest, der Benutzern auf Anmeldungsseiten angezeigt wird
AllowSynchronousIO false Steuert, ob synchrone E/A-Vorgänge für HttpContext.Request und HttpContext.Response zulässig sind.
MaxRequestBodySize 30000000 Dient zum Abrufen oder Festlegen der maximalen Größe des Anforderungstexts für HttpRequest. Beachten Sie, dass IIS selbst das Limit maxAllowedContentLength aufweist, das vor der in den IISServerOptions festgelegten MaxRequestBodySize verarbeitet wird. Das Ändern von MaxRequestBodySize hat keine Auswirkungen auf maxAllowedContentLength. Zum Erhöhen von maxAllowedContentLength fügen Sie einen Eintrag in web.config hinzu, um maxAllowedContentLength auf einen höheren Wert festzulegen. Weitere Informationen hierzu finden Sie unter Konfiguration.

Unterschiede zwischen In-Process- und Out-of-Process-Hosting

Die folgenden Merkmale treffen für In-Process-Hosting zu:

  • Der IIS-HTTP-Server (IISHttpServer) wird anstelle des Kestrel-Servers verwendet. Beim In-Process-Hosting ruft CreateDefaultBuilderUseIIS zu folgendem Zweck auf:

    • Registrieren des IISHttpServer.
    • Konfigurieren des Ports und des Basispfads, den der Server überwachen soll, wenn er hinter dem ASP.NET Core-Modul ausgeführt wird.
    • Konfigurieren des Hosts zum Erfassen von Startfehlern.
  • Das requestTimeout-Attribut trifft auf das In-Process-Hosting nicht zu.

  • Das gemeinsame Verwenden eines Anwendungspools durch mehrere Apps wird nicht unterstützt. Verwenden Sie einen Anwendungspool pro App.

  • Die Architektur (Bitbreite) der App und der installierten Runtime (x64 oder x86) müssen mit der Architektur des Anwendungspools übereinstimmen. Für Apps, die für 32 Bit (x86) veröffentlicht wurden, müssen z. B. 32 Bit für ihre IIS-Anwendungspools aktiviert sein. Weitere Informationen finden Sie im Abschnitt Erstellen der IIS-Website.

  • Verbindungstrennungen von Clients werden erkannt. Das HttpContext.RequestAborted-Abbruchtoken wird abgebrochen, wenn der Client die Verbindung trennt.

  • Beim In-Process-Hosting wird AuthenticateAsync nicht intern aufgerufen, um einen Benutzer zu initialisieren. Deshalb ist eine IClaimsTransformation-Implementierung, die verwendet wird, um Ansprüche nach jeder Authentifizierung zu transformieren, nicht standardmäßig aktiviert. Rufen Sie AddAuthentication auf, um Authentifizierungsdienste hinzuzufügen, wenn Ansprüche mit einer IClaimsTransformation-Implementierung transformiert werden:

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();

Abrufen von Informationen zum zeitlichen Ablauf

Siehe Abrufen detaillierter Zeitangaben mit „IHttpSysRequestTimingFeature“.

Beim Einsatz von In-Process-Hosting wird eine ASP.NET Core-App im gleichen Prozess wie ihr IIS-Workerprozess ausgeführt. Durch das In-Process-Hosting wird die Leistung des Out-of-Process-Hosting verbessert, da Anforderungen nicht per Proxy über den Loopbackadapter weitergeleitet werden. Dabei handelt es sich um eine Netzwerkschnittstelle, die ausgehenden Netzwerkdatenverkehr zum selben Computer zurück leitet.

Das folgende Diagramm zeigt die Beziehung zwischen IIS, dem ASP.NET Core-Modul und einer In-Process gehosteten App:

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

Aktivieren von In-Process-Hosting

Seit ASP.NET Core 3.0 ist In-Process-Hosting standardmäßig für alle für die IIS bereitgestellten Apps aktiviert.

Legen Sie den Wert der <AspNetCoreHostingModel>-Eigenschaft in der Projektdatei (.csproj) auf InProcess fest, um eine App explizit für In-Process-Hosting zu konfigurieren:

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

Allgemeine Architektur

Der allgemeine Anforderungsflow lautet wie folgt:

  1. Eine Anforderung geht aus dem Web beim HTTP.sys-Treiber im Kernelmodus ein.
  2. Der Treiber leitet die native Anforderung an IIS auf dem konfigurierten Port der Webseite weiter, normalerweise 80 (HTTP) oder 443 (HTTPS).
  3. Das ASP.NET Core-Modul empfängt die native Anforderung und übergibt sie an den IIS-HTTP-Server (IISHttpServer). Der IIS-HTTP-Server ist eine prozessinterne Serverimplementierung für IIS, die die Anforderung vom nativen Modus in den verwalteten Modus konvertiert.

Nach der Verarbeitung der Anforderung durch den IIS-HTTP-Server:

  1. Die Anforderung wird an die ASP.NET Core-Middlewarepipeline gesendet.
  2. Die Middleware-Pipeline behandelt die Anforderung und gibt sie als HttpContext-Instanz an die App-Logik weiter.
  3. Die Antwort der App wird über den IIS-HTTP-Server zurück an IIS übergeben.
  4. IIS übermittelt die Antwort an den Client, der die Anforderung initiiert hat.

CreateDefaultBuilder fügt eine IServer-Instanz hinzu, indem die UseIIS-Methode aufgerufen wird, um die CoreCLR zu starten und die App im IIS-Workerprozess zu hosten (w3wp.exe oder iisexpress.exe). Leistungstests weisen darauf hin, dass das In-Process-Hosting einer .NET Core-App einen weitaus höheren Anforderungsdurchsatz bietet als das Out-of-Process-Hosting der App mit Weiterleitung der Anforderungen über einen Proxy an Kestrel.

Apps, die als einzelne ausführbare Datei veröffentlicht wurden, können vom In-Prozess-Hostingmodell nicht geladen werden.

Anwendungskonfiguration

Schließen Sie zur Konfiguration von IIS-Optionen eine Dienstkonfiguration für IISServerOptions in ConfigureServices ein. Mit dem folgenden Beispiel wird AutomaticAuthentication deaktiviert:

services.Configure<IISServerOptions>(options => 
{
    options.AutomaticAuthentication = false;
});
Option Standard Einstellung
AutomaticAuthentication true Bei Festlegung auf true legt der Server den per Windows-Authentifizierung authentifizierten HttpContext.User fest. Bei Festlegung auf false stellt der Server nur eine Identität für HttpContext.User bereit und antwortet auf explizite Anforderungen durch AuthenticationScheme. Die Windows-Authentifizierung muss in IIS aktiviert sein, damit AutomaticAuthentication funktioniert. Weitere Informationen finden Sie unter Windows-Authentifizierung.
AuthenticationDisplayName null Legt den Anzeigename fest, der Benutzern auf Anmeldungsseiten angezeigt wird
AllowSynchronousIO false Steuert, ob synchrone E/A-Vorgänge für HttpContext.Request und HttpContext.Response zulässig sind.
MaxRequestBodySize 30000000 Dient zum Abrufen oder Festlegen der maximalen Größe des Anforderungstexts für HttpRequest. Beachten Sie, dass IIS selbst das Limit maxAllowedContentLength aufweist, das vor der in den IISServerOptions festgelegten MaxRequestBodySize verarbeitet wird. Das Ändern von MaxRequestBodySize hat keine Auswirkungen auf maxAllowedContentLength. Zum Erhöhen von maxAllowedContentLength fügen Sie einen Eintrag in web.config hinzu, um maxAllowedContentLength auf einen höheren Wert festzulegen. Weitere Informationen hierzu finden Sie unter Konfiguration.

Unterschiede zwischen In-Process- und Out-of-Process-Hosting

Die folgenden Merkmale treffen für In-Process-Hosting zu:

  • Der IIS-HTTP-Server (IISHttpServer) wird anstelle des Kestrel-Servers verwendet. Beim In-Process-Hosting ruft CreateDefaultBuilderUseIIS zu folgendem Zweck auf:

    • Registrieren des IISHttpServer.
    • Konfigurieren des Ports und des Basispfads, den der Server überwachen soll, wenn er hinter dem ASP.NET Core-Modul ausgeführt wird.
    • Konfigurieren des Hosts zum Erfassen von Startfehlern.
  • Das requestTimeout-Attribut trifft auf das In-Process-Hosting nicht zu.

  • Das gemeinsame Verwenden eines Anwendungspools durch mehrere Apps wird nicht unterstützt. Verwenden Sie einen Anwendungspool pro App.

  • Die Architektur (Bitbreite) der App und der installierten Runtime (x64 oder x86) müssen mit der Architektur des Anwendungspools übereinstimmen. Für Apps, die für 32 Bit (x86) veröffentlicht wurden, müssen z. B. 32 Bit für ihre IIS-Anwendungspools aktiviert sein. Weitere Informationen finden Sie im Abschnitt Erstellen der IIS-Website.

  • Verbindungstrennungen von Clients werden erkannt. Das HttpContext.RequestAborted-Abbruchtoken wird abgebrochen, wenn der Client die Verbindung trennt.

  • Beim In-Process-Hosting wird AuthenticateAsync nicht intern aufgerufen, um einen Benutzer zu initialisieren. Deshalb ist eine IClaimsTransformation-Implementierung, die verwendet wird, um Ansprüche nach jeder Authentifizierung zu transformieren, nicht standardmäßig aktiviert. Rufen Sie AddAuthentication auf, um Authentifizierungsdienste hinzuzufügen, wenn Ansprüche mit einer IClaimsTransformation-Implementierung transformiert werden:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient<IClaimsTransformation, ClaimsTransformer>();
        services.AddAuthentication(IISServerDefaults.AuthenticationScheme);
    }
    
    public void Configure(IApplicationBuilder app)
    {
        app.UseAuthentication();
    }
    
  • Bereitstellungen von Webpaketen (Einzeldateien) werden nicht unterstützt.