Oefening: aangepaste middleware maken
Ontwikkelaars kunnen aangepaste middlewareonderdelen maken om functionaliteit toe te voegen aan een ASP.NET Core-app. Aangepaste middleware kan overal in de middleware-pijplijn worden ingevoegd en kunnen worden gebruikt met ingebouwde middlewareonderdelen, zoals in dit voorbeeld wordt weergegeven:
Het netwerkbewerkingsteam van uw bedrijf is het oplossen van prestatieproblemen in de productieomgeving. Uw team leidde u ertoe om bepaalde functies te implementeren om realtime bewaking van de app beter te ondersteunen. De app moet de aanvraaggegevens naar de console registreren. Voor elke aanvraag moet de aanvraagmethode, het pad en de antwoordstatuscode worden vastgelegd.
In deze oefening maakt u een aangepast middleware-onderdeel waarmee de details van de console worden opgeslagen.
Aangepaste middleware toevoegen
Laten we de bestaande ASP.NET Core-app wijzigen zodat aangepaste middleware wordt opgenomen waarmee gegevens van de aanvraag naar de console worden opgeslagen.
Open het Program.cs-bestand als het nog niet is geopend.
Voeg direct voordat
app.Run()u de volgende code invoegt:app.Use(async (context, next) => { Console.WriteLine($"{context.Request.Method} {context.Request.Path} {context.Response.StatusCode}"); await next(); });In de voorgaande code:
-
app.Use()voegt een aangepast middlewareonderdeel toe aan de pijplijn. Het onderdeel gebruikt eenHttpContextobject en eenRequestDelegateobject als parameters. - De gedelegeerde schrijft de aanvraagmethode, het pad en de antwoordstatuscode naar de console.
-
await next()roept het volgende middlewareonderdeel aan in de pijplijn.
-
De wijzigingen testen
Druk op Ctrl+Shift+F5 om de app opnieuw te bouwen en opnieuw te starten.
Wanneer het browservenster wordt geopend, ziet u dat in de hoofd-URL 'Welkom bij Contoso' wordt weergegeven.
Voeg toe
/historyaan de URL en druk op Enter. De browser wordt omgeleid naar de/aboutpagina.Druk in Visual Studio Code op Ctrl+Shift+P om het opdrachtenpalet te openen. Zoek en selecteer Console voor foutopsporing: focus op consoleweergave voor foutopsporing om over te schakelen naar het tabblad Console voor foutopsporing in het onderste deelvenster. Let op de volgende regels:
GET / 200 GET /about 200De console-uitvoer toont de aanvraagmethode, het pad en de antwoordstatuscode voor elke aanvraag. Op de eerste regel wordt de aanvraag voor de hoofd-URL weergegeven en op de tweede regel wordt de aanvraag voor de
/aboutpagina weergegeven.Notitie
Uw browser kan ook een verzoek indienen
/favicon.ico. Dit is een standaardaanvraag voor de favicon van een website en kan worden genegeerd.Laat de app actief voor de volgende oefening.
De volgorde van middleware wijzigen
De app lijkt te werken, maar er is een probleem. U hebt de /history pagina aangevraagd, maar de console-uitvoer wordt niet weergegeven. Dit gedrag komt doordat het aangepaste middlewareonderdeel dat aanvraagdetails registreert, is toegevoegd na de URL-rewriter-middleware. De URL-rewriter middleware leidt aanvragen van /history en /about verzendt het antwoord en het aangepaste middlewareonderdeel ziet de aanvraag niet. Laten we dit oplossen.
Verplaats de
app.Use()lijn die u direct vóór deapp.UseRewriter()regel hebt toegevoegd.Het volledige bestand Program.cs moet er als volgt uitzien:
using Microsoft.AspNetCore.Rewrite; var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.Use(async (context, next) => { Console.WriteLine($"{context.Request.Method} {context.Request.Path} {context.Response.StatusCode}"); await next(); }); app.UseRewriter(new RewriteOptions().AddRedirect("history", "about")); app.MapGet("/", () => "Hello World!"); app.MapGet("/about", () => "Contoso was founded in 2000."); app.Run();Het aangepaste middlewareonderdeel wordt nu toegevoegd voordat de URL-middleware opnieuw wordt geschreven. Het aangepaste middleware-onderdeel registreert de aanvraagdetails voordat de URL-rewriter middleware de aanvraag verwerkt en omleidt.
Start de app opnieuw op en test deze als voorheen. Deze keer moet de uitvoer van de console voor foutopsporing de aanvraag voor de
/historypagina bevatten.GET / 200 GET /history 200 GET /about 200In de console-uitvoer wordt nu de aanvraag voor de
/historypagina weergegeven voordat deze wordt omgeleid naar de/aboutpagina.
De statuscode herstellen
De app is bijna klaar, maar er is nog een probleem. De statuscode in de console-uitvoer is altijd 200, zelfs wanneer de app de aanvraag omleidt. De statuscode voor de /history aanvraag moet een 302-omleiding zijn. De reden voor dit gedrag is een ander orderprobleem waarbij de middleware-onderdelen worden verwerkt.
Het aangepaste middleware-onderdeel registreert de details naar de console en roept await next() vervolgens aan om door te geven aan het volgende middlewareonderdeel. Het probleem is dat de StatusCode eigenschap van het Response object is ingesteld nadat het terminal-middlewareonderdeel het antwoord start. We gaan de code wijzigen om dit op te lossen.
Verplaats de
Console.WriteLine()regel naar na deawait next()regel in de gedelegeerde die u hebt toegevoegd.De bijgewerkte code moet er als volgt uitzien:
app.Use(async (context, next) => { await next(); Console.WriteLine($"{context.Request.Method} {context.Request.Path} {context.Response.StatusCode}"); });Met het aangepaste middlewareonderdeel worden de aanvraaggegevens vastgelegd nadat het terminal-middlewareonderdeel de antwoordstatuscode heeft ingesteld.
Start de aanvraag opnieuw en test deze
/historyopnieuw. In de uitvoer van de console voor foutopsporing moet nu de juiste statuscode worden weergegeven.GET / 200 GET /history 302 GET /about 200