Delen via


In-process hosting met IIS en ASP.NET Core

Note

Dit is niet de nieuwste versie van dit artikel. Zie de .NET 9-versie van dit artikel voor de huidige release.

Warning

Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie het .NET- en .NET Core-ondersteuningsbeleid voor meer informatie. Zie de .NET 9-versie van dit artikel voor de huidige release.

Important

Deze informatie heeft betrekking op een pre-releaseproduct dat aanzienlijk kan worden gewijzigd voordat het commercieel wordt uitgebracht. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, met betrekking tot de informatie die hier wordt verstrekt.

Zie de .NET 9-versie van dit artikel voor de huidige release.

Tijdens het hosten van processen wordt een ASP.NET Core-app uitgevoerd in hetzelfde proces als het IIS-werkproces. In-process hosting biedt verbeterde prestaties ten opzichte van out-of-process hosting, omdat aanvragen niet worden geproxied via de loopback-adapter, een netwerkinterface die uitgaand netwerkverkeer terugstuurt naar dezelfde computer.

In het volgende diagram ziet u de relatie tussen IIS, de ASP.NET Core Module en een app die in het proces wordt gehost:

ASP.NET Core-module in het scenario voor in-proceshosting

In-process hosting inschakelen

Sinds ASP.NET Core 3.0 is in-process hosting standaard ingeschakeld voor alle apps die zijn geïmplementeerd in IIS.

Als u een app expliciet wilt configureren voor in-process hosting, stelt u de waarde van de <AspNetCoreHostingModel> eigenschap InProcess in op in het projectbestand (.csproj):

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

General architecture

De algemene stroom van een aanvraag is als volgt:

  1. Een verzoek van het web komt aan bij de kernelmodus HTTP.sys driver.
  2. Het stuurprogramma stuurt de systeemeigen aanvraag naar IIS op de geconfigureerde poort van de website, meestal 80 (HTTP) of 443 (HTTPS).
  3. De ASP.NET Core-module ontvangt de systeemeigen aanvraag en geeft deze door aan IIS HTTP Server (IISHttpServer). IIS HTTP Server is een in-process server-implementatie voor IIS die de aanvraag converteert van systeemeigen naar beheerd.

Nadat de IIS HTTP-server de aanvraag heeft verwerkt:

  1. De aanvraag wordt verzonden naar de ASP.NET Core-middlewarepijplijn.
  2. De middleware-pijplijn verwerkt de aanvraag en geeft deze als een HttpContext exemplaar door aan de logica van de app.
  3. Het antwoord van de app wordt teruggegeven aan IIS via IIS HTTP Server.
  4. IIS verzendt het antwoord naar de client die de aanvraag heeft gestart.

CreateDefaultBuilder voegt een IServer exemplaar toe door de UseIIS methode aan te roepen om de CoreCLR op te starten en de app binnen het IIS-werkproces (w3wp.exe of iisexpress.exe) te hosten. nl-NL: Prestatietests geven aan dat het hosten van een .NET-app in-proces aanzienlijk hogere aanvraagdoorvoer levert in vergelijking met het hosten van de app out-of-process en het proxien van aanvragen naar Kestrel.

Apps die zijn gepubliceerd als één uitvoerbaar bestand, kunnen niet worden geladen door het in-process hostingmodel.

Application configuration

Als u IIS-opties wilt configureren, moet u een serviceconfiguratie opnemen voor IISServerOptions in Program.cs. In het volgende voorbeeld wordt AutomaticAuthentication uitgeschakeld:

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 Default Setting
AutomaticAuthentication true Als true, stelt de IIS-server HttpContext.User in die is geverifieerd door Windows-verificatie. Wanneer false, biedt de server uitsluitend een identiteit voor HttpContext.User en reageert op uitdagingen wanneer expliciet aangevraagd door de AuthenticationScheme. Windows-verificatie moet zijn ingeschakeld in IIS om AutomaticAuthentication te kunnen functioneren. Zie Windows-verificatie voor meer informatie.
AuthenticationDisplayName null Hiermee stelt u de weergavenaam in die wordt weergegeven aan gebruikers op aanmeldingspagina's.
AllowSynchronousIO false Of synchrone I/O is toegestaan voor de HttpContext.Request en de HttpContext.Response.
MaxRequestBodySize 30000000 Hiermee haalt of stelt u de maximale grootte van de aanvraagbody voor de HttpRequest. IIS zelf heeft de limiet maxAllowedContentLength die wordt verwerkt vóór de MaxRequestBodySize set in de IISServerOptions. Als u het MaxRequestBodySize wijzigt, heeft dit geen invloed op de maxAllowedContentLength. Verhoog maxAllowedContentLength door een vermelding toe te voegen in web.config om maxAllowedContentLength op een hogere waarde in te stellen. Zie Configuratie voor meer informatie.

Verschillen tussen in-process en out-of-process hosting

De volgende kenmerken zijn van toepassing bij het hosten in het proces:

  • IIS HTTP-server (IISHttpServer) wordt gebruikt in plaats van Kestrel server. Tijdens het proces roept CreateDefaultBuilderUseIIS aan om het volgende te doen:

    • Registreer de IISHttpServer.
    • Configureer de poort en het basispad waarop de server moet luisteren wanneer deze achter de ASP.NET Core-module wordt uitgevoerd.
    • Configureer de host om opstartfouten vast te leggen.
  • Het requestTimeout kenmerk is niet van toepassing op in-process hosting.

  • Het delen van een app-pool tussen apps wordt niet ondersteund. Gebruik één app-pool per app.

  • De architectuur (bitness) van de app en de geïnstalleerde runtime (x64 of x86) moet overeenkomen met de architectuur van de app-pool. Bijvoorbeeld, apps die zijn gepubliceerd voor 32-bits (x86) moeten 32-bit ingeschakeld hebben voor hun IIS-toepassingsgroepen. Zie de sectie IIS-site maken voor meer informatie.

  • Clientverbindingen worden losgekoppeld. Het HttpContext.RequestAborted annuleringstoken wordt geannuleerd wanneer de client de verbinding verbreekt.

  • Bij het hosten in in-procesmodus wordt AuthenticateAsync niet intern aangeroepen om een gebruiker te initialiseren. Daarom is een IClaimsTransformation implementatie die na elke verificatie wordt gebruikt om claims te transformeren, niet standaard geactiveerd. Bij het transformeren van claims met een IClaimsTransformation implementatie roept u AddAuthentication aan om authenticatiediensten toe te voegen.

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

Tijdsinformatie ophalen

Zie Gedetailleerde timing-informatie ophalen met IHttpSysRequestTimingFeature.

Tijdens het hosten van processen wordt een ASP.NET Core-app uitgevoerd in hetzelfde proces als het IIS-werkproces. In-process hosting biedt verbeterde prestaties ten opzichte van out-of-process hosting, omdat aanvragen niet worden geproxied via de loopback-adapter, een netwerkinterface die uitgaand netwerkverkeer terugstuurt naar dezelfde computer.

In het volgende diagram ziet u de relatie tussen IIS, de ASP.NET Core Module en een app die in het proces wordt gehost:

ASP.NET Core-module in het scenario voor in-proceshosting

In-process hosting inschakelen

Sinds ASP.NET Core 3.0 is in-process hosting standaard ingeschakeld voor alle apps die zijn geïmplementeerd in IIS.

Als u een app expliciet wilt configureren voor in-process hosting, stelt u de waarde van de <AspNetCoreHostingModel> eigenschap InProcess in op in het projectbestand (.csproj):

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

General architecture

De algemene stroom van een aanvraag is als volgt:

  1. Een verzoek van het web komt aan bij de kernelmodus HTTP.sys driver.
  2. Het stuurprogramma stuurt de systeemeigen aanvraag naar IIS op de geconfigureerde poort van de website, meestal 80 (HTTP) of 443 (HTTPS).
  3. De ASP.NET Core-module ontvangt de systeemeigen aanvraag en geeft deze door aan IIS HTTP Server (IISHttpServer). IIS HTTP Server is een in-process server-implementatie voor IIS die de aanvraag converteert van systeemeigen naar beheerd.

Nadat de IIS HTTP-server de aanvraag heeft verwerkt:

  1. De aanvraag wordt verzonden naar de ASP.NET Core-middlewarepijplijn.
  2. De middleware-pijplijn verwerkt de aanvraag en geeft deze als een HttpContext exemplaar door aan de logica van de app.
  3. Het antwoord van de app wordt teruggegeven aan IIS via IIS HTTP Server.
  4. IIS verzendt het antwoord naar de client die de aanvraag heeft gestart.

CreateDefaultBuilder voegt een IServer exemplaar toe door de UseIIS methode aan te roepen om de CoreCLR op te starten en de app binnen het IIS-werkproces (w3wp.exe of iisexpress.exe) te hosten. nl-NL: Prestatietests geven aan dat het hosten van een .NET-app in-proces aanzienlijk hogere aanvraagdoorvoer levert in vergelijking met het hosten van de app out-of-process en het proxien van aanvragen naar Kestrel.

Apps die zijn gepubliceerd als één uitvoerbaar bestand, kunnen niet worden geladen door het in-process hostingmodel.

Application configuration

Als u IIS-opties wilt configureren, moet u een serviceconfiguratie opnemen voor IISServerOptions in ConfigureServices. In het volgende voorbeeld wordt AutomaticAuthentication uitgeschakeld:

services.Configure<IISServerOptions>(options => 
{
    options.AutomaticAuthentication = false;
});
Option Default Setting
AutomaticAuthentication true Als true, stelt de IIS-server HttpContext.User in die is geverifieerd door Windows-verificatie. Wanneer false, biedt de server uitsluitend een identiteit voor HttpContext.User en reageert op uitdagingen wanneer expliciet aangevraagd door de AuthenticationScheme. Windows-verificatie moet zijn ingeschakeld in IIS om AutomaticAuthentication te kunnen functioneren. Zie Windows-verificatie voor meer informatie.
AuthenticationDisplayName null Hiermee stelt u de weergavenaam in die wordt weergegeven aan gebruikers op aanmeldingspagina's.
AllowSynchronousIO false Of synchrone I/O is toegestaan voor de HttpContext.Request en de HttpContext.Response.
MaxRequestBodySize 30000000 Hiermee haalt of stelt u de maximale grootte van de aanvraagbody voor de HttpRequest. IIS zelf heeft de limiet maxAllowedContentLength die wordt verwerkt vóór de MaxRequestBodySize set in de IISServerOptions. Als u het MaxRequestBodySize wijzigt, heeft dit geen invloed op de maxAllowedContentLength. Verhoog maxAllowedContentLength door een vermelding toe te voegen in web.config om maxAllowedContentLength op een hogere waarde in te stellen. Zie Configuratie voor meer informatie.

Verschillen tussen in-process en out-of-process hosting

De volgende kenmerken zijn van toepassing bij het hosten in het proces:

  • IIS HTTP-server (IISHttpServer) wordt gebruikt in plaats van Kestrel server. Tijdens het proces roept CreateDefaultBuilderUseIIS aan om het volgende te doen:

    • Registreer de IISHttpServer.
    • Configureer de poort en het basispad waarop de server moet luisteren wanneer deze achter de ASP.NET Core-module wordt uitgevoerd.
    • Configureer de host om opstartfouten vast te leggen.
  • Het requestTimeout kenmerk is niet van toepassing op in-process hosting.

  • Het delen van een app-pool tussen apps wordt niet ondersteund. Gebruik één app-pool per app.

  • De architectuur (bitness) van de app en de geïnstalleerde runtime (x64 of x86) moet overeenkomen met de architectuur van de app-pool. Bijvoorbeeld, apps die zijn gepubliceerd voor 32-bits (x86) moeten 32-bit ingeschakeld hebben voor hun IIS-toepassingsgroepen. Zie de sectie IIS-site maken voor meer informatie.

  • Clientverbindingen worden losgekoppeld. Het HttpContext.RequestAborted annuleringstoken wordt geannuleerd wanneer de client de verbinding verbreekt.

  • Bij het hosten in in-procesmodus wordt AuthenticateAsync niet intern aangeroepen om een gebruiker te initialiseren. Daarom is een IClaimsTransformation implementatie die na elke verificatie wordt gebruikt om claims te transformeren, niet standaard geactiveerd. Bij het transformeren van claims met een IClaimsTransformation implementatie roept u AddAuthentication aan om authenticatiediensten toe te voegen.

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient<IClaimsTransformation, ClaimsTransformer>();
        services.AddAuthentication(IISServerDefaults.AuthenticationScheme);
    }
    
    public void Configure(IApplicationBuilder app)
    {
        app.UseAuthentication();
    }
    
  • Implementaties van webpakketten (één bestand) worden niet ondersteund.