Dela via


Pågående värdtjänster med IIS och ASP.NET Core

Not

Det här är inte den senaste versionen av den här artikeln. Den aktuella utgåvan finns i version av .NET 9 av den här artikeln.

Varning

Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i .NET och .NET Core Support Policy. Den aktuella versionen finns i den .NET 9-versionen av den här artikeln.

Viktig

Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.

Den aktuella versionen hittas i -versionen av .NET 9 av den här artikeln.

I-process-värdtjänst kör en ASP.NET Core-app i samma process som dess IIS-arbetsprocess. In-process hosting ger bättre prestanda jämfört med out-of-process hosting eftersom begäranden inte proxyförs över loopback-adaptern, ett nätverksgränssnitt som returnerar utgående trafik tillbaka till samma dator.

Följande diagram illustrerar relationen mellan IIS, ASP.NET Core Module och en app som hanteras i processen:

ASP.NET Core Module i det pågående värdscenariot

Aktivera aktivering av processervering

Sedan ASP.NET Core 3.0 har pågående värdtjänster aktiverats som standard för alla appar som distribueras till IIS.

Om du uttryckligen vill konfigurera en app för in-process hosting anger du värdet för egenskapen <AspNetCoreHostingModel> till InProcess i projektfilen (.csproj):

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

Allmän arkitektur

Det allmänna flödet för en begäran är följande:

  1. En begäran kommer från webben till drivrutinen HTTP.sys i kärnläge.
  2. Drivrutinen dirigerar den interna begäran till IIS på webbplatsens konfigurerade port, vanligtvis 80 (HTTP) eller 443 (HTTPS).
  3. ASP.NET Core-modulen tar emot den interna begäran och skickar den till IIS HTTP Server (IISHttpServer). IIS HTTP Server är en processbaserad serverimplementering för IIS som konverterar begäran från intern till hanterad.

När IIS HTTP Server har bearbetat begäran:

  1. Begäran skickas till pipelinen för ASP.NET Core-mellanprogram.
  2. Pipelinen för mellanprogram hanterar begäran och skickar den som en HttpContext instans till appens logik.
  3. Appens svar skickas tillbaka till IIS via IIS HTTP Server.
  4. IIS skickar svaret till klienten som initierade begäran.

CreateDefaultBuilder lägger till en IServer-instans genom att anropa metoden UseIIS för att starta CoreCLR- och vara värd för appen i IIS-arbetsprocessen (w3wp.exe eller iisexpress.exe). Prestandatester indikerar att värd för en .NET Core-app in-process ger betydligt högre begärandegenomströmning jämfört med att vara värd för appen out-of-process och proxyar begäranden till Kestrel.

Appar som publiceras som en enda körbar fil kan inte läsas in av den processinterna värdmodellen.

Programkonfiguration

Om du vill konfigurera IIS-alternativ inkluderar du en tjänstkonfiguration för IISServerOptions i Program.cs. I följande exempel inaktiveras 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();
Alternativ Förval Inställning
AutomaticAuthentication true Om trueställer IIS Server in HttpContext.User autentiserad av Windows-autentisering. Om falsetillhandahåller servern endast en identitet för HttpContext.User och svarar på utmaningar när den uttryckligen begärs av AuthenticationScheme. Windows-autentisering måste vara aktiverat i IIS för att AutomaticAuthentication ska fungera. Mer information finns i Windows-autentisering.
AuthenticationDisplayName null Anger visningsnamnet som visas för användare på inloggningssidor.
AllowSynchronousIO false Om synkron I/O tillåts för HttpContext.Request och HttpContext.Response.
MaxRequestBodySize 30000000 Hämtar eller anger maximal storlek på begärandetexten för HttpRequest. Observera att IIS självt har gräns maxAllowedContentLength, vilket kommer att behandlas före gräns MaxRequestBodySize sätts i IISServerOptions. Om du ändrar MaxRequestBodySize påverkas inte maxAllowedContentLength. Om du vill öka maxAllowedContentLengthlägger du till en post i web.config för att ställa in maxAllowedContentLength till ett högre värde. Mer information finns i Configuration.

Skillnader mellan in-process och out-of-process hosting

Följande egenskaper gäller när du är värd för en process:

  • IIS HTTP Server (IISHttpServer) används i stället för Kestrel server. För pågående process kallar CreateDefaultBuilderUseIIS att:

    • Registrera IISHttpServer.
    • Konfigurera porten och basstigen som servern ska lyssna på när den körs bakom ASP.NET Core-modulen.
    • Konfigurera hosten för att fånga startfel.
  • Attributet requestTimeout gäller inte för pågående värdtjänster.

  • Det går inte att dela en apppool mellan appar. Använd en apppool per app.

  • Arkitektur (bitness) för appen och installerat körsystem (x64 eller x86) måste överensstämma med arkitekturen för apppoolen. Appar som har publicerats för 32-bitars (x86) måste till exempel ha 32-bitars aktiverat för sina IIS-programpooler. Mer information finns i avsnittet Skapa IIS-webbplatsen.

  • Klientfrånkopplingar identifieras. Den HttpContext.RequestAborted annulleringstoken avbryts när klienten kopplas från.

  • När du kör in-process anropas inte AuthenticateAsync internt för att initiera en användare. Därför aktiveras inte en IClaimsTransformation implementering som används för att omvandla anspråk efter varje autentisering som standard. När du omvandlar anspråk med en IClaimsTransformation implementering anropar du AddAuthentication för att lägga till autentiseringstjänster:

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

In-process-värd kör en ASP.NET Core-app i samma process som dess IIS-arbetsprocessen. In-process hosting ger bättre prestanda jämfört med out-of-process hosting eftersom förfrågningar inte dirigeras via loopback-adapter, ett nätverksgränssnitt som returnerar utgående nätverkstrafik tillbaka till samma dator.

Följande diagram illustrerar relationen mellan IIS, ASP.NET Core Module och en app som hanteras i processen:

ASP.NET Core Module i det pågående värdscenariot

Aktivera aktivering av processervering

Sedan ASP.NET Core 3.0 har pågående värdtjänster aktiverats som standard för alla appar som distribueras till IIS.

Om du uttryckligen vill konfigurera en app för in-process hosting anger du värdet för egenskapen <AspNetCoreHostingModel> till InProcess i projektfilen (.csproj):

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

Allmän arkitektur

Det allmänna flödet för en begäran är följande:

  1. En begäran kommer från webben till kärnläge drivrutin HTTP.sys.
  2. Drivrutinen dirigerar den interna begäran till IIS på webbplatsens konfigurerade port, vanligtvis 80 (HTTP) eller 443 (HTTPS).
  3. ASP.NET Core-modulen tar emot den interna begäran och skickar den till IIS HTTP Server (IISHttpServer). IIS HTTP Server är en processbaserad serverimplementering för IIS som konverterar begäran från intern till hanterad.

När IIS HTTP Server har bearbetat begäran:

  1. Begäran skickas till pipelinen för ASP.NET Core-mellanprogram.
  2. Pipelinen för mellanprogram hanterar begäran och skickar den som en HttpContext instans till appens logik.
  3. Appens svar skickas tillbaka till IIS via IIS HTTP Server.
  4. IIS skickar svaret till klienten som initierade begäran.

CreateDefaultBuilder lägger till en IServer-instans genom att anropa metoden UseIIS för att starta CoreCLR- och vara värd för appen i IIS-arbetsprocessen (w3wp.exe eller iisexpress.exe). Prestandatester indikerar att värdskap av en .NET Core-app i-processen ger betydligt högre dataflöde för begäranden jämfört med att vara värd för appens out-of-process och proxy-begäranden till Kestrel.

Appar som publiceras som en enda körbar fil kan inte läsas in av värdmodellen för processer.

Programkonfiguration

Om du vill konfigurera IIS-alternativ inkluderar du en tjänstkonfiguration för IISServerOptions i ConfigureServices. I följande exempel inaktiveras AutomaticAuthentication:

services.Configure<IISServerOptions>(options => 
{
    options.AutomaticAuthentication = false;
});
Alternativ Förvalt Inställning
AutomaticAuthentication true Om true, ställer IIS Server in HttpContext.User som autentiseras av Windows-autentisering. Om falsetillhandahåller servern endast en identitet för HttpContext.User och svarar på utmaningar när den uttryckligen begärs av AuthenticationScheme. Windows-autentisering måste vara aktiverat i IIS för att AutomaticAuthentication ska fungera. Mer information finns i Windows-autentisering.
AuthenticationDisplayName null Anger visningsnamnet som visas för användare på inloggningssidor.
AllowSynchronousIO false Om synkron I/O tillåts för HttpContext.Request och HttpContext.Response.
MaxRequestBodySize 30000000 Hämtar eller anger maximal storlek på begärandetexten för HttpRequest. Observera att IIS själv har gränsen maxAllowedContentLength som kommer att bearbetas innan MaxRequestBodySize anges i IISServerOptions. Om du ändrar MaxRequestBodySize påverkas inte maxAllowedContentLength. Om du vill öka maxAllowedContentLength, lägger du till en post i web.config för att ställa in maxAllowedContentLength till ett högre värde. Mer information finns i Configuration.

Skillnader mellan in-process och out-of-process hosting

Följande egenskaper gäller när du är värd för en process:

  • IIS HTTP Server (IISHttpServer) används i stället för Kestrel server. För pågående process anropar CreateDefaultBuilderUseIIS för att:

    • Registrera IISHttpServer.
    • Konfigurera porten och bassökvägen som servern ska lyssna på när den körs bakom ASP.NET Core-modulen.
    • Konfigurera värdenheten för att samla in startfel.
  • Attributet requestTimeout gäller inte för pågående värdtjänster.

  • Det går inte att dela en apppool mellan appar. Använd en apppool per app.

  • Arkitekturen (bitness) för applikationen och den installerade runtime-miljön (x64 eller x86) måste matcha arkitekturen i applikationspoolen. Appar som har publicerats för 32-bitars (x86) måste till exempel ha 32-bitars aktiverat för sina IIS-programpooler. Mer information finns i avsnittet Skapa IIS-webbplatsen.

  • Klientfrånkopplingar identifieras. Avbrytningstoken HttpContext.RequestAborted annulleras när klienten kopplas från.

  • När du är värd för en process anropas inte AuthenticateAsync internt för att initiera en användare. Därför aktiveras inte en IClaimsTransformation implementering som används för att omvandla anspråk efter varje autentisering som standard. När du omvandlar anspråk med en IClaimsTransformation implementering anropar du AddAuthentication för att lägga till autentiseringstjänster:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient<IClaimsTransformation, ClaimsTransformer>();
        services.AddAuthentication(IISServerDefaults.AuthenticationScheme);
    }
    
    public void Configure(IApplicationBuilder app)
    {
        app.UseAuthentication();
    }
    
  • distributioner av webbpaket (en fil) stöds inte.