Övning – Skapa anpassade mellanprogram
Utvecklare kan skapa anpassade mellanprogramskomponenter för att lägga till funktioner i en ASP.NET Core-app. Anpassade mellanprogram kan infogas var som helst i pipelinen för mellanprogram och kan användas med inbyggda mellanprogramkomponenter, som du ser i det här exemplet:
Företagets nätverksdriftsteam felsöker prestandaproblem i produktionsmiljön. Ditt team ledde dig till att implementera vissa funktioner för att bättre stödja realtidsövervakning av appen. Appen bör logga information om begäranden till konsolen. För varje begäran bör den logga begärandemetoden, sökvägen och svarsstatuskoden.
I den här övningen skapar du en anpassad mellanprogramskomponent som loggar begärandeinformation till konsolen.
Lägga till anpassade mellanprogram
Nu ska vi ändra den befintliga ASP.NET Core-appen så att den innehåller anpassade mellanprogram som loggar begärandeinformation till konsolen.
Öppna filen Program.cs om den inte redan är öppen.
Omedelbart före
app.Run()infogar du följande kod:app.Use(async (context, next) => { Console.WriteLine($"{context.Request.Method} {context.Request.Path} {context.Response.StatusCode}"); await next(); });I koden ovan:
-
app.Use()lägger till en anpassad mellanprogramskomponent i pipelinen. Komponenten tar ettHttpContextobjekt och ettRequestDelegateobjekt som parametrar. - Ombudet skriver statuskoden för begärandemetoden, sökvägen och svaret till konsolen.
-
await next()anropar nästa mellanprogramskomponent i pipelinen.
-
Testa ändringarna
Tryck på Ctrl+Skift+F5 för att återskapa och starta om appen.
När webbläsarfönstret öppnas noterar du att rot-URL:en visar "Välkommen till Contoso!"
Lägg till
/historyi URL:en och tryck på Retur. Webbläsaren omdirigeras till sidan/about.I Visual Studio Code trycker du på Ctrl+Skift+P för att öppna kommandopaletten. Sök efter och välj Felsökningskonsol: Fokusera på felsökningskonsolvyn för att växla till fliken Felsökningskonsol i den nedre panelen. Observera följande rader:
GET / 200 GET /about 200Konsolens utdata visar statuskoden för begärandemetod, sökväg och svar för varje begäran. Den första raden visar begäran om rot-URL:en och den andra raden visar begäran för
/aboutsidan.Kommentar
Webbläsaren kan också begära
/favicon.ico. Detta är en standardbegäran för en webbplats favicon och kan ignoreras.Låt appen vara igång för nästa övning.
Ändra ordningen på mellanprogram
Appen verkar fungera, men det finns ett problem. Du har begärt sidan /history , men konsolens utdata visar den inte. Det här beteendet beror på att den anpassade mellanprogramskomponenten som loggar information om begäran lades till efter url-omskrivningsmellanprogrammet. URL-skrivmaskinen omdirigerar begäranden från /history till /about och skickar svaret, och den anpassade mellanprogramskomponenten ser inte begäran. Vi fixar det här.
Flytta den
app.Use()rad som du lade till direkt föreapp.UseRewriter()raden.Den fullständiga Program.cs filen bör se ut så här:
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();Nu läggs den anpassade mellanprogramkomponenten till innan URL-skrivmaskinens mellanprogram. Komponenten för anpassade mellanprogram loggar begärandeinformationen innan URL-skrivmaskinen bearbetar begäran och omdirigerar den.
Starta om appen igen och testa den som tidigare. Den här gången ska utdata från felsökningskonsolen innehålla begäran för
/historysidan.GET / 200 GET /history 200 GET /about 200Konsolens utdata visar nu begäran för
/historysidan precis innan den omdirigeras till sidan/about.
Åtgärda statuskoden
Appen är nästan klar, men det finns ett problem till. Statuskoden i konsolens utdata är alltid 200, även när appen omdirigerar begäran. Statuskoden för /history begäran ska vara en 302-omdirigering. Orsaken till det här beteendet är ett annat ordningsproblem där mellanprogramkomponenterna bearbetas.
Den anpassade mellanprogramskomponenten loggar informationen till konsolen och anropar await next() sedan för att skicka till nästa mellanprogramskomponent. Problemet är att StatusCode objektets Response egenskap har angetts när terminalens mellanprogramskomponent startar svaret. Nu ska vi ändra koden för att åtgärda detta.
Flytta raden till efter
Console.WriteLine()raden i ombudet som du har lagtawait next()till.Den uppdaterade koden bör se ut så här:
app.Use(async (context, next) => { await next(); Console.WriteLine($"{context.Request.Method} {context.Request.Path} {context.Response.StatusCode}"); });Nu loggar den anpassade mellanprogramskomponenten begärandeinformationen när terminalens mellanprogramskomponent anger svarsstatuskoden.
Starta om och testa
/historybegäran igen. Felsökningskonsolens utdata bör nu visa rätt statuskod.GET / 200 GET /history 302 GET /about 200