Middleware begrijpen
Het doel van een webtoepassing is het ontvangen en reageren op HTTP-aanvragen. Er wordt een aanvraag ontvangen en vervolgens genereert de server het juiste antwoord. Alles in ASP.NET Core heeft betrekking op deze aanvraag-/reactiecyclus.
Wanneer een ASP.NET Core-app een HTTP-aanvraag ontvangt, wordt er een reeks onderdelen doorgegeven om het antwoord te genereren. Deze onderdelen worden middleware genoemd. Middleware kan worden beschouwd als een pijplijn die de aanvraag doorloopt en elke middlewarelaag kan code uitvoeren voor en na de volgende laag in de pijplijn.
Middleware en gemachtigden
Middleware wordt geïmplementeerd als gemachtigde die een HttpContext object accepteert en een Task. Het HttpContext object vertegenwoordigt de huidige aanvraag en het huidige antwoord. De gemachtigde is een functie die de aanvraag en het antwoord verwerkt.
Denk bijvoorbeeld aan de volgende code:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Run(async context =>
{
await context.Response.WriteAsync("Hello world!");
});
app.Run();
In de voorgaande code:
-
WebApplication.CreateBuilder(args)maakt een nieuwWebApplicationBuilderobject. -
builder.Build()maakt een nieuwWebApplicationobject. - De eerste
app.Run()definieert een gemachtigde die eenHttpContextobject neemt en eenTask. De gedelegeerde schrijft 'Hallo wereld!' naar het antwoord. - De tweede
app.Run()start de app.
Wanneer de app een HTTP-aanvraag ontvangt, wordt de gemachtigde aangeroepen. De gedelegeerde schrijft 'Hallo wereld!' naar het antwoord en voltooit de aanvraag.
Middleware koppelen
In de meeste apps hebt u meerdere middlewareonderdelen die op volgorde worden uitgevoerd. De volgorde waarin u middlewareonderdelen aan de pijplijn toevoegt, is belangrijk. De onderdelen worden uitgevoerd in de volgorde waarin ze zijn toegevoegd.
Terminal- en niet-terminal-middleware
Elke middleware kan worden beschouwd als terminal of niet-terminal. Niet-terminale middleware verwerkt de aanvraag en roept vervolgens de volgende middleware aan in de pijplijn. Terminal-middleware is de laatste middleware in de pijplijn en heeft geen volgende middleware die moet worden aangeroepen.
Gedelegeerden die zijn toegevoegd, app.Use() kunnen terminal- of niet-terminal-middleware zijn. Deze gemachtigden verwachten een HttpContext object en een RequestDelegate object als parameters. Normaal gesproken bevat await next.Invoke();de gemachtigde . Hiermee wordt de controle doorgegeven aan de volgende middleware in de pijplijn. Code vóór die regel wordt uitgevoerd vóór de volgende middleware en code na die regel wordt uitgevoerd na de volgende middleware. Een gemachtigde die is toegevoegd, app.Use() krijgt twee mogelijkheden om te reageren op een aanvraag voordat het antwoord naar de client wordt verzonden. Eenmaal voordat het antwoord wordt gegenereerd door de terminal-middleware, en nogmaals nadat het antwoord is gegenereerd door de terminal-middleware.
Gemachtigden die zijn toegevoegd, app.Run() zijn altijd terminale middleware. Ze roepen de volgende middleware niet aan in de pijplijn. Dit is het laatste middlewareonderdeel dat wordt uitgevoerd. Ze verwachten alleen een HttpContext object als parameter.
app.Run() is een snelkoppeling voor het toevoegen van terminal-middleware.
Kijk een naar het volgende voorbeeld:
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();
In de voorgaande code:
-
app.Use()definieert een middlewareonderdeel dat:- Schrijft 'Hallo van middleware 1. Doorgegeven aan de volgende middleware! aan het antwoord.
- Geeft de aanvraag door aan het volgende middleware-onderdeel in de pijplijn en wacht totdat deze is voltooid.
await next.Invoke() - Nadat het volgende onderdeel in de pijplijn is voltooid, wordt 'Hello from middleware 1 again' geschreven.
- De eerste
app.Run()definieert een middlewareonderdeel dat 'Hello from middleware 2! schrijft' naar het antwoord. - De tweede
app.Run()start de app.
Wanneer een webbrowser tijdens runtime een aanvraag naar deze app verzendt, worden de middlewareonderdelen uitgevoerd in de volgorde waarin ze aan de pijplijn zijn toegevoegd. De app retourneert het volgende antwoord:
Hello from middleware 1. Passing to the next middleware!
Hello from middleware 2!
Hello from middleware 1 again!
Ingebouwde middleware
ASP.NET Core biedt een set ingebouwde middlewareonderdelen die u kunt gebruiken om algemene functionaliteit aan uw app toe te voegen. Naast de expliciet toegevoegde middlewareonderdelen wordt er impliciet een aantal middleware voor u toegevoegd. Retourneert bijvoorbeeld WebApplication.CreateBuilder() een WebApplicationBuilder die de middleware voor de routering van de uitzonderingspagina voor ontwikkelaars toevoegt, de verificatie- en autorisatie-middleware voorwaardelijk toevoegt als de gerelateerde services zijn geconfigureerd en de middleware voor eindpuntroutering toevoegt.
Denk bijvoorbeeld aan het volgende Program.cs bestand:
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();
In de voorgaande code:
-
app.UseExceptionHandler()voegt een middlewareonderdeel toe dat uitzonderingen onderschept en een foutpagina retourneert. -
app.UseHsts()voegt een middlewareonderdeel toe waarmee de header Strict-Transport-Security wordt ingesteld. -
app.UseHttpsRedirection()voegt een middlewareonderdeel toe waarmee HTTP-aanvragen worden omgeleid naar HTTPS. -
app.UseAntiforgery()voegt een middlewareonderdeel toe dat aanvraagvervalsingsaanvallen (CSRF) op meerdere sites voorkomt. -
app.MapStaticAssets()enapp.MapRazorComponents<App>()routes toewijzen aan eindpunten, die vervolgens worden verwerkt door de middleware voor eindpuntroutering. De middleware voor eindpuntroutering wordt impliciet toegevoegd door deWebApplicationBuilder.
Er zijn veel meer ingebouwde middlewareonderdelen die u in uw app kunt gebruiken, afhankelijk van het type app en uw behoeften. Raadpleeg de documentatie voor de volledige lijst.
Aanbeveling
In deze context zijn methoden die beginnen Use meestal voor het toewijzen van middleware. Methoden die beginnen met Map , zijn over het algemeen voor toewijzingseindpunten.
Belangrijk
De middlewareonderdelen van de order worden toegevoegd aan de pijplijn. Bepaalde middlewareonderdelen moeten worden uitgevoerd voordat anderen correct werken. Raadpleeg de documentatie voor elk middlewareonderdeel om de juiste volgorde te bepalen.