Förstå mellanprogram
Syftet med ett webbprogram är att ta emot och svara på HTTP-begäranden. En begäran tas emot och sedan genererar servern rätt svar. Allt i ASP.NET Core handlar om den här begäran/svarscykeln.
När en ASP.NET Core-app tar emot en HTTP-begäran skickas en serie komponenter för att generera svaret. Dessa komponenter kallas för mellanprogram. Mellanprogram kan ses som en pipeline som begäran flödar igenom, och varje mellanprogramskikt kan köra kod före och efter nästa lager i pipelinen.
Mellanprogram och ombud
Mellanprogram implementeras som ett ombud som tar ett HttpContext objekt och returnerar en Task. Objektet HttpContext representerar den aktuella begäran och det aktuella svaret. Ombudet är en funktion som bearbetar begäran och svaret.
Tänk till exempel på följande kod:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Run(async context =>
{
    await context.Response.WriteAsync("Hello world!");
});
app.Run();
I koden ovan:
- 
              
WebApplication.CreateBuilder(args)skapar ett nyttWebApplicationBuilderobjekt. - 
              
builder.Build()skapar ett nyttWebApplicationobjekt. - Den första 
app.Run()definierar ett ombud som tar ettHttpContextobjekt och returnerar enTask. Ombudet skriver "Hello world!" till svaret. - Den andra 
app.Run()startar appen. 
När appen tar emot en HTTP-begäran anropas ombudet. Ombudet skriver "Hello world!" till svaret och slutför begäran.
Länka mellanprogram
I de flesta appar har du flera mellanprogramskomponenter som körs i följd. I vilken ordning du lägger till mellanprogramskomponenter i pipelinen är det viktigt. Komponenterna körs i den ordning de lades till.
Terminal- och icke-terminal mellanprogram
Varje mellanprogram kan betraktas som terminal eller icke-terminal. Icke-terminal mellanprogram bearbetar begäran och anropar sedan nästa mellanprogram i pipelinen. Terminalmellanprogram är det sista mellanprogrammet i pipelinen och har inget nästa mellanprogram att anropa.
Ombud som läggs till med app.Use() kan vara terminal- eller icke-terminal mellanprogram. Dessa ombud förväntar sig ett HttpContext objekt och ett RequestDelegate objekt som parametrar. Vanligtvis innehåller await next.Invoke();ombudet . Detta skickar kontrollen till nästa mellanprogram i pipelinen. Koden innan raden körs före nästa mellanprogram och koden efter den raden körs efter nästa mellanprogram. Ett ombud som läggs till med app.Use() får två möjligheter att agera på en begäran innan svaret skickas till klienten. En gång innan svaret genereras av terminalmellanprogrammet och igen när svaret genereras av terminalmellanprogrammet.
Ombud som läggs till med app.Run() är alltid terminalmellanprogram. De anropar inte nästa mellanprogram i pipelinen. De är den sista mellanprogramskomponenten som körs. De förväntar sig bara ett HttpContext objekt som en parameter. 
              app.Run() är en genväg för att lägga till terminalmellanprogram.
Ta följande som exempel:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Use(async (context, next) =>
{
    await context.Response.WriteAsync("Hello from middleware 1. Passing to the next middleware!\r\n");
    // Call the next middleware in the pipeline
    await next.Invoke();
    await context.Response.WriteAsync("Hello from middleware 1 again!\r\n");
});
app.Run(async context =>
{
    await context.Response.WriteAsync("Hello from middleware 2!\r\n");
});
app.Run();
I koden ovan:
- 
              
app.Use()definierar en mellanprogramskomponent som:- Skriver "Hello from middleware 1. Skicka till nästa mellanprogram!" till svaret.
 - Skickar begäran till nästa mellanprogramskomponent i pipelinen och väntar tills den har slutförts med 
await next.Invoke(). - När nästa komponent i pipelinen är klar skriver den "Hello from middleware 1 again!"
 
 - Den första 
app.Run()definierar en mellanprogramskomponent som skriver "Hello from middleware 2!" till svaret. - Den andra 
app.Run()startar appen. 
När en webbläsare skickar en begäran till den här appen körs mellanprogramkomponenterna i den ordning de lades till i pipelinen när en webbläsare skickar en begäran till den här appen. Appen returnerar följande svar:
Hello from middleware 1. Passing to the next middleware!
Hello from middleware 2!
Hello from middleware 1 again!
Inbyggda mellanprogram
ASP.NET Core innehåller en uppsättning inbyggda mellanprogramskomponenter som du kan använda för att lägga till vanliga funktioner i din app. Förutom de explicit tillagda mellanprogramskomponenterna läggs vissa mellanprogram implicit till åt dig som standard. Returnerar till exempel WebApplication.CreateBuilder() en WebApplicationBuilder som lägger till mellanprogrammet för utvecklarens undantagssidadirigering, lägger villkorligt till mellanprogrammet för autentisering och auktorisering om de relaterade tjänsterna konfigureras och lägger till mellanprogrammet för slutpunktsroutning.
Tänk till exempel på följande Program.cs fil:
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error", createScopeForErrors: true);
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}
app.UseHttpsRedirection();
app.UseAntiforgery();
app.MapStaticAssets();
app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();
app.Run();
I koden ovan:
- 
              
app.UseExceptionHandler()lägger till en mellanprogramskomponent som fångar undantag och returnerar en felsida. - 
              
app.UseHsts()lägger till en mellanprogramskomponent som anger rubriken Strict-Transport-Security. - 
              
app.UseHttpsRedirection()lägger till en mellanprogramskomponent som omdirigerar HTTP-begäranden till HTTPS. - 
              
app.UseAntiforgery()lägger till en mellanprogramskomponent som förhindrar förfalskning av begäranden mellan webbplatser (CSRF). - 
              
app.MapStaticAssets()ochapp.MapRazorComponents<App>()mappa vägar till slutpunkter, som sedan hanteras av mellanprogrammet för slutpunktsroutning. Mellanprogrammet för slutpunktsdirigering läggs implicit tillWebApplicationBuilderav . 
Det finns många fler inbyggda mellanprogramkomponenter som du kan använda i din app beroende på apptyp och behov. I dokumentationen finns en fullständig lista.
Dricks
I det här sammanhanget är metoder som börjar med Use vanligtvis för att mappa mellanprogram. Metoder som börjar med Map används vanligtvis för att mappa slutpunkter.
Viktigt!
Ordermellanprogramkomponenterna läggs till i pipelinen! Vissa mellanprogramskomponenter måste köras innan andra fungerar korrekt. Kontrollera dokumentationen för varje mellanprogramskomponent för att fastställa rätt ordning.