Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Note
Dit is niet de nieuwste versie van dit artikel. Zie de .NET 10-versie van dit artikel voor de huidige release.
Warning
Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie de .NET- en .NET Core-ondersteuningsbeleidvoor meer informatie. Zie de .NET 10-versie van dit artikel voor de huidige release.
In dit artikel wordt beschreven hoe ASP.NET Core apps worden opgestart en hoe u services en de aanvraagpijplijn van de app configureert.
Voor richtlijnen met betrekking tot Blazor-opstart, die de richtlijnen in dit artikel aanvullen of vervangen, zie ASP.NET Core Blazor-opstart-.
Het Program bestand
ASP.NET Core-apps initialiseren en configureren het opstartproces in het bestand Program van de app (Program.cs).
Het eerste deel van het Program bestand richt zich op het bouwen van de app. Deze fase maakt gebruik WebApplication.CreateBuilder van het initialiseren van een nieuw exemplaar van de WebApplicationBuilder klasse met vooraf geconfigureerde standaardwaarden voordat de app wordt gestart. De ASP.NET Core projectsjablonen wijzen de webtoepassingsbouwer toe aan een variabele met de naambuilder:
var builder = WebApplication.CreateBuilder(args);
Eigenschappen van de webtoepassingsbouwer zijn onder andere:
-
builder.Configurationis een IConfigurationBuilder en IConfigurationRoot voor het beheren van configuratiebronnen en providers. Zie Configuratie in ASP.NET Core voor meer informatie. -
builder.Environmentis een IWebHostEnvironment die informatie geeft over de webhostingomgeving van de app. Zie ASP.NET Core runtime-omgevingen voor meer informatie. -
builder.Hostis een IHostBuilder voor het configureren van hostspecifieke eigenschappen. Zie .NET Generic Host in ASP.NET Core voor meer informatie. -
builder.Loggingis een ILoggingBuilder met extensiemethoden waarmee logboekproviders worden toegevoegd en beheerd. Zie Logboekregistratie in .NET en ASP.NET Core voor meer informatie. -
builder.Metrics(.NET 8 of hoger) staat het inschakelen van metrische gegevens en het doorsturen van de uitvoer toe. Zie ASP.NET Core-metrische gegevensvoor meer informatie. -
builder.Servicesis een verzameling afhankelijkheidsinjectieservices (IServiceCollectionDI) die de app kan samenstellen voor Inversion of Control (IoC). Zie Afhankelijkheidsinjectie in ASP.NET Corevoor meer informatie. -
builder.WebHostis een IWebHostBuilder voor het configureren van serverspecifieke eigenschappen.
De app wordt gebouwd door WebApplicationBuilder.Build aan te roepen, die de gebouwde WebApplication retourneert. De ASP.NET Core projectsjablonen wijzen de ingebouwde webtoepassing toe aan een variabele met de naamapp:
var app = builder.Build();
Het volgende deel van het Program bestand is gericht op het tot stand brengen van de pijplijn voor het verwerken van HTTP-aanvragen als een reeks middlewareonderdelen. Elke middleware voert bewerkingen uit op een HttpContext en roept de volgende middleware in de pijplijn aan of beëindigt de aanvraag. Volgens de conventie worden middleware-onderdelen aan de pijplijn toegevoegd door een extensiemethode aan te roepen die begint met 'Use. Zie ASP.NET Core middleware voor meer informatie.
De Run methode start de app en blokkeert de aanroepende thread totdat de host wordt afgesloten:
app.Run();
Wanneer Run wordt uitgevoerd, gaat de app over naar een actief, draaiend proces:
Gehoste services worden gestart.
De host doorloopt alle geregistreerde gehoste services (IHostedService-instanties) en roept hun StartAsync-methoden aan. Tenzij de app zich aanmeldt voor gelijktijdig opstarten van gehoste services (.NET 8 of hoger), worden gehoste services opeenvolgend gestart in de volgorde van hun DI-containerregistraties. Zie Achtergrondtaken met gehoste services in ASP.NET Core voor meer informatie.
De middleware-pijplijn is gebouwd.
Wanneer
builder.Buildwordt aangeroepen, worden afhankelijkheden opgelost, maar de werkelijke verwerkingspijplijn is niet volledig ingesteld. Wanneerapp.Runwordt uitgevoerd, finaliseert het framework de HTTP-middlewarepipeline. De gedefinieerde middleware-methoden en endpointtoewijzingen worden gecompileerd tot één uiterst efficiënte reeks uitvoeringsdelegaten. Zie ASP.NET Core middleware voor meer informatie.De webserver (Kestrel standaard) wordt gestart.
De host kijkt in de afhankelijkheidscontainer, zoekt de implementatie van de geregistreerde server (meestal Kestrel) en activeert de opstartcyclus. Kestrel dan:
- Zoekt de gedefinieerde hosting-URL's en poorten op uit configuratie, omgevingsvariabelen of opdrachtregelargumenten.
- Opent fysieke netwerksockets en wijst deze toe.
- Koppelt poorten en begint te luisteren naar binnenkomend verkeer.
Zie .NET Generic Host in ASP.NET Core, webserver-implementaties in ASP.NET Core en Kestrel webserver in ASP.NET Core voor meer informatie.
Levenscyclusgebeurtenissen bij het starten van de toepassing worden geactiveerd.
De IHostApplicationLifetime service activeert het ApplicationStarted token, dat callbacks aanroept die zijn geregistreerd op het token. Alle callbacks, database seeders en andere aangepaste gebeurtenislisteners die zijn ingesteld om te wachten tot het token wordt geactiveerd, worden vervolgens geactiveerd om de verwerking te starten.
De belangrijkste uitvoeringsthread wordt geblokkeerd terwijl de app wordt uitgevoerd.
Run (
app.Run()) wacht synchroon tot het afsluiten.De app is klaar om aanvragen te verwerken.
Op dit punt registreert de opdrachtshell hostingdiagnostiek:
info: Microsoft.Hosting.Lifetime[14] Now listening on: https://localhost:7123 info: Microsoft.Hosting.Lifetime[14] Now listening on: http://localhost:5123 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down.
De app blijft in deze status voor onbepaalde tijd, waarbij binnenkomend webverkeer via de middleware-pijplijn wordt doorgegeven en antwoorden worden verzonden.
Wanneer een afsluitsignaal wordt ontvangen, bijvoorbeeld wanneer Ctrl+c wordt gedetecteerd in de opdrachtsregelinterface waarin de app wordt uitgevoerd of een containerorkestratietool een SIGTERM-signaal verzendt, Run wordt gedeblokkeerd en vinden de volgende acties plaats:
ApplicationStopping tokens worden geactiveerd, waardoor de app logica kan uitvoeren voordat het afsluitproces begint.
De Kestrel server wordt afgesloten, waardoor nieuwe verbindingen worden uitgeschakeld. De server wacht tot verzoeken op bestaande verbindingen zijn afgerond, voor zover de time-out voor afsluiten dat toelaat. De server verzendt de header voor het sluiten van de verbinding voor verdere aanvragen voor bestaande verbindingen.
De host sluit geregistreerde gehoste services af. Tenzij de app ervoor kiest om gehoste services gelijktijdig te stoppen (.NET 8 of hoger), stoppen gehoste services opeenvolgend in de omgekeerde volgorde van hun DI-containerregistraties. Zie Achtergrondtaken met gehoste services in ASP.NET Core voor meer informatie.
ApplicationStopped gebeurtenis-handlers worden geactiveerd, waardoor de app logica kan uitvoeren nadat de app is afgesloten.
De uitvoering in de console wordt netjes beëindigd met afsluitcode 0.
De Startup-klasse configureert services en de aanvraagpijplijn van de app.
De Startup klasse
ASP.NET Core apps een opstartklasse gebruiken, die wordt genoemd Startup volgens conventie. De klasse Startup:
- U kunt desgewenst een ConfigureServices methode gebruiken om de -services van de app te configureren. Een service is een herbruikbaar onderdeel dat app-functionaliteit biedt. Services worden geregistreerd in
ConfigureServicesen binnen de app gebruikt via afhankelijkheidsinjectie (DI) of ApplicationServices. - Bevat een Configure methode voor het maken van de aanvraagverwerkingspijplijn van de app.
ConfigureServices en Configure worden aangeroepen door de ASP.NET Core-runtime wanneer de app wordt gestart:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
}
}
De Startup-klasse wordt opgegeven wanneer de host van de app is gebouwd. De Startup klasse wordt doorgaans opgegeven door de hostbouwer aan te roepen WebHostBuilderExtensions.UseStartup :
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
De host biedt services die beschikbaar zijn voor de Startup klasseconstructor. De app voegt extra services toe via ConfigureServices. Zowel de host- als app-services zijn beschikbaar in Configure en in de hele app.
Alleen de volgende servicetypen kunnen worden geïnjecteerd in de Startup constructor bij gebruik van de Generic Host (IHostBuilder):
public class Startup
{
private readonly IWebHostEnvironment _env;
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Configuration = configuration;
_env = env;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
if (_env.IsDevelopment())
{
}
else
{
}
}
}
De meeste services zijn pas beschikbaar als de Configure methode wordt aangeroepen.
Note
Het privéveld in het voorgaande voorbeeld IWebHostEnvironment krijgt een naam met een onderstrepingsteken (_env). Het is ook acceptabel om een coderingsconventie te gebruiken die dezelfde naam gebruikt als de geïnjecteerde IWebHostEnvironment (env) wanneer het privéveld het this trefwoord (this.env = env in de constructor en env.IsDevelopment() in de ConfigureServices methode) gebruikt.
De ASP.NET Core projectsjablonen vóór .NET 8 en C# 12 gebruiken geen primaire constructors, maar de voorgaande code kan worden geherstructureerd om een primaire constructor te gebruiken als uw organisatie een .NET 8 of hoger gebruikt en de app is gericht op C# 12 of hoger (bijvoorbeeld<LangVersion>12.0</LangVersion>). Zie Primaire constructors declareren voor klassen en structs (C#-documentatie) en Primaire constructors (C#-handleiding) voor meer informatie.
Meerdere Startup klassen
Wanneer de app afzonderlijke Startup klassen definieert voor verschillende omgevingen (bijvoorbeeld StartupDevelopment), wordt de juiste Startup klasse geselecteerd tijdens runtime. De klasse waarvan het achtervoegsel de naam overeenkomt met de huidige omgeving, krijgt prioriteit. Als de app wordt uitgevoerd in de Development omgeving en zowel een Startup klasse als een StartupDevelopment klasse bevat, wordt de StartupDevelopment klasse gebruikt. Zie Meerdere omgevingen gebruikenvoor meer informatie.
De methode ConfigureServices
De optionele ConfigureServices methode is:
- Aangeroepen door de host vóór de
Configuremethode om de services van de app te configureren. - Waar configuratieopties volgens conventie worden ingesteld.
De host kan bepaalde services configureren voordat Startup methoden worden aangeroepen. Zie ASP.NET Overzicht van basisbeginselen van Core voor meer informatie.
Voor functies waarvoor een aanzienlijke installatie is vereist, zijn er uitbreidingsmethoden beschikbaar Add{Service}IServiceCollection, zoals:
- AddDbContext
- AddDefaultIdentity
- AddEntityFrameworkStores
- AddRazorPages
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>(
options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddRazorPages();
}
}
Als u services toevoegt aan de servicecontainer, worden deze beschikbaar in de app en in de Configure methode. De services worden opgelost via afhankelijkheidsinjectie of van ApplicationServices.
De methode Configure
De methode Configure wordt gebruikt om op te geven hoe de app reageert op HTTP-aanvragen. De aanvraagpijplijn wordt geconfigureerd door middleware- onderdelen toe te voegen aan een IApplicationBuilder exemplaar.
IApplicationBuilder is beschikbaar voor de methode Configure, maar deze is niet geregistreerd in de servicecontainer. Hosting maakt een IApplicationBuilder en geeft deze rechtstreeks door aan Configure.
De ASP.NET Core-sjablonen de pijplijn configureren met ondersteuning voor:
- uitzonderingspagina voor ontwikkelaars
- Uitzonderingsafhandelaar
- HTTP Strict Transport Security (HSTS)
- HTTPS-omleiding
- Statische bestanden
- ASP.NET Core MVC en Razor Pagina's
In het volgende voorbeeld ziet u middleware voor een typische Razor Pages-app:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
Het voorgaande voorbeeld is bedoeld voor Razor Pagina's; de MVC-versie is vergelijkbaar.
Elke Use extensiemethode voegt een of meer middlewareonderdelen toe aan de aanvraagpijplijn.
UseStaticFiles configureert bijvoorbeeld middleware om statische bestandenaan te bieden.
Elk middlewareonderdeel in de aanvraagpijplijn is verantwoordelijk voor het aanroepen van het volgende onderdeel in de pijplijn of het kortsluiten van de keten, indien van toepassing.
Aanvullende services, zoals IWebHostEnvironment, ILoggerFactoryof iets dat is gedefinieerd in ConfigureServices, kunnen worden opgegeven in de Configure methodehandtekening. Deze services worden geïnjecteerd als ze beschikbaar zijn.
Zie IApplicationBuilder voor meer informatie over het gebruik en de volgorde van middlewareverwerking.
Services configureren zonder klasse Startup
Als u services en de aanvraagverwerkingspijplijn wilt configureren zonder een Startup-klasse te gebruiken, roept u ConfigureServices aan en Configure gemaksmethoden op de hostbouwer. Meerdere oproepen naar ConfigureServices worden aan elkaar gekoppeld. Als er meerdere Configure methode-aanroepen bestaan, wordt de laatste Configure aanroep gebruikt.
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureServices(services =>
{
...
})
.Configure(app =>
{
...
});
});
}
Opstartfilters
Hoewel een app doorgaans een expliciete middleware-uitvoeringspijplijn maakt, is een opstartfilter (IStartupFilter) handig voor:
- Een gedeelde bibliotheek/NuGet-pakket maken waarmee aangepaste middleware automatisch wordt geladen zonder dat de app expliciet de middlewaremethode '
Use' aanroept. De consument van de bibliotheek hoeft bijvoorbeeld geen aanroep te doen voor eenapp.UseImageProcessingMiddlewaremiddleware voor het verwerken van afbeeldingen in de aanvraagverwerkingspijplijn van de app. - Het garanderen van een deel van middleware wordt uitgevoerd voor of na andere middleware, ongeacht hoe een ontwikkelaar de aanvraagverwerkingspijplijn van de app wijzigt.
Een implementatie van een opstartfilter biedt een IStartupFilter.Configure-methode die een Action<IApplicationBuilder> ontvangt en retourneert. De IApplicationBuilder interface wordt gebruikt om de aanvraagpijplijn van de app te configureren. Zie Een middleware-pijplijn maken met IApplicationBuildervoor meer informatie.
Elke implementatie van opstartfilters kan een of meer middlewares toevoegen aan de aanvraagpijplijn. De filters worden aangeroepen in de volgorde waarin ze worden toegevoegd aan de servicecontainer. Filters kunnen middleware toevoegen vóór of nadat ze de uitvoering aan het volgende filter hebben doorgegeven, waardoor ze aan het begin of einde van de pijplijn worden toegevoegd.
In het volgende voorbeeld ziet u hoe u een middleware registreert bij IStartupFilter. Het CustomResponseHeaderFilter opstartfilter maakt gebruik van middleware om een aangepaste header (X-Custom-Header) toe te voegen aan alle reacties van de app voordat andere middlewares worden uitgevoerd.
CustomResponseHeaderFilter.cs:
using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
public class CustomResponseHeaderFilter : IStartupFilter
{
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
return builder =>
{
// 1. Add middleware that runs BEFORE subsequent middlewares
builder.Use(async (context, nextMiddleware) =>
{
context.Response.Headers.Append("X-Custom-Header", "VALUE");
await nextMiddleware();
});
// 2. Call the rest of the application's configuration pipeline
next(builder);
// 3. (Optional) Add middleware that runs AFTER the rest of the pipeline
};
}
}
De implementatie van het opstartfilter is geregistreerd in het Program bestand:
builder.Services.AddTransient<IStartupFilter, CustomResponseHeaderFilter>();
De implementatie van het opstartfilter is geregistreerd in Startup.ConfigureServices:
services.AddTransient<IStartupFilter, CustomResponseHeaderFilter>();
De uitvoeringsvolgorde van middleware wordt ingesteld op basis van de volgorde van opstartfilterregistraties:
- Meerdere implementaties kunnen communiceren met dezelfde objecten. Als de volgorde belangrijk is, rangschik dan de serviceregistraties zodanig dat ze overeenkomen met de volgorde waarin de middlewares moeten worden uitgevoerd.
- Bibliotheken kunnen middleware toevoegen met een of meer implementaties die vóór of na andere app-middleware worden uitgevoerd die zijn geregistreerd bij IStartupFilter. Een opstartfilter-middleware aanroepen voordat een middleware wordt toegevoegd door het opstartfilter van een bibliotheek:
- Plaats de registratie van de opstartfilterservice voordat de bibliotheek wordt toegevoegd aan de servicecontainer.
- Als u deze later wilt aanroepen, plaatst u de serviceregistratie nadat de bibliotheek is toegevoegd.
Note
U kunt de ASP.NET Core-app niet uitbreiden met startupfilters wanneer u de Configure delegate overschrijft. Zie WebApplicationFactory Client retourneert NotFound voor alle aanvragen met de methode Overrideing Configure (dotnet/aspnetcore #45372) voor meer informatie.
Configuratie toevoegen bij het opstarten vanuit een externe assembly
Met een IHostingStartup-implementatie kunnen tijdens het opstarten uitbreidingen aan een app worden toegevoegd vanuit een externe assembly, buiten het Startup-bestand of de Program-klasse van de app. Zie Hosting-opstartassembly's gebruiken in ASP.NET Corevoor meer informatie.
De Startup klasse (ConfigureServices en Configure methoden)
Hoewel een Startup-klasse wordt ondersteund in ASP.NET Core-apps die gericht zijn op .NET 6 of hoger, wordt het gebruik ervan niet aanbevolen. Zie Migreren van ASP.NET Core in .NET 5 naar .NET 6 voor meer informatie.
Zie het volgende voor informatie over het gebruik van de ConfigureServices en Configure methoden met het minimale hostingmodel:
Opstartprestaties meten
De ASP.NET Core hosting EventSource verzendt de ServerReady gebeurtenis, die het punt aangeeft waarop de server gereed is om te reageren op aanvragen en kan worden gebruikt om de opstarttijd te meten. Zie Logboekregistratie in .NET en ASP.NET Core voor meer informatie.