Øvelse – Opprett egendefinert mellomvare
Utviklere kan opprette egendefinerte mellomvarekomponenter for å legge til funksjonalitet i en ASP.NET Core-app. Egendefinert mellomvare kan settes inn hvor som helst i mellomvareforløpet og kan brukes med innebygde mellomvarekomponenter, som vist i dette eksemplet:
Firmaets nettverksoperasjonsteam feilsøker ytelsesproblemer i produksjonsmiljøet. Teamets leder har bedt deg implementere noen funksjoner for bedre å støtte sanntidsovervåking av appen. Appen bør logge forespørselsdetaljer til konsollen. For hver forespørsel bør den logge forespørselsmetoden, banen og svarstatuskoden.
I denne øvelsen oppretter du en egendefinert mellomvarekomponent som logger forespørselsdetaljer til konsollen.
Legg til egendefinert mellomvare
La oss endre den eksisterende ASP.NET Core-appen til å inkludere egendefinert mellomvare som logger forespørselsdetaljer til konsollen.
Åpne Program.cs filen hvis den ikke allerede er åpen.
Rett før
app.Run()setter du inn følgende kode:app.Use(async (context, next) => { Console.WriteLine($"{context.Request.Method} {context.Request.Path} {context.Response.StatusCode}"); await next(); });I den forrige koden:
-
app.Use()legger til en egendefinert mellomvarekomponent i datasamlebåndet. Komponenten tar etHttpContextobjekt og etRequestDelegateobjekt som parametere. - Representanten skriver forespørselsmetoden, banen og svarstatuskoden til konsollen.
-
await next()kaller opp den neste mellomvarekomponenten i datasamlebåndet.
-
Test endringene
Trykk CTRL+SKIFT+F5 for å gjenoppbygge og starte appen på nytt.
Når nettleservinduet åpnes, noterer du rot-URL-adressen «Velkommen til Contoso!»
Legg til
/historyi nettadressen, og trykk ENTER. Nettleseren omdirigeres til/about-siden.Trykk CTRL+SKIFT+P i Visual Studio Code for å åpne kommandopaletten. Søk etter og velg Feilsøkingskonsoll: Fokuser på feilsøkingskonsollvisning for å bytte til fanen Feilsøkingskonsoll i det nederste panelet. Legg merke til følgende linjer:
GET / 200 GET /about 200Konsollutdataene viser forespørselsmetoden, banen og svarstatuskoden for hver forespørsel. Den første linjen viser forespørselen om rot-URL-adressen, og den andre linjen viser forespørselen om
/about-siden.Notat
Nettleseren kan også be om
/favicon.ico. Dette er en standard forespørsel om favicon for et nettsted og kan ignoreres.La appen kjøre for neste øvelse.
Endre rekkefølgen på mellomvare
Appen ser ut til å fungere, men det er et problem. Du ba om /history-siden, men utdataene fra konsollen viser den ikke. Denne virkemåten er fordi den egendefinerte mellomvarekomponenten som logger forespørselsdetaljer ble lagt til etter mellomvaren for url-omskriving. Mellomvareomskrivingen for URL-adressen omdirigerer forespørsler fra /history til /about og sender svaret, og den egendefinerte mellomvarekomponenten ser ikke forespørselen. La oss løse dette.
Flytt den
app.Use()linjen du la til rett førapp.UseRewriter()linjen.Den fullstendige Program.cs filen skal se slik ut:
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();Nå legges den egendefinerte mellomvarekomponenten til før mellomvaren for nettadresseomskriving. Den egendefinerte mellomvarekomponenten logger forespørselsdetaljene før mellomvaren for nettadressen behandler forespørselen og omdirigerer den.
Start appen på nytt, og test den som før. Denne gangen skal feilsøkingskonsoll utdata inkludere forespørselen om
/history-siden.GET / 200 GET /history 200 GET /about 200Konsollutdataene viser nå forespørselen om
/history-siden rett før den omdirigeres til/about-siden.
Rette statuskoden
Appen er nesten klar, men det er ett problem til. Statuskoden i konsollutdataene er alltid 200, selv når appen omdirigerer forespørselen. Statuskoden for /history forespørselen skal være en 302-omadressering. Årsaken til denne virkemåten er et annet ordreproblem der mellomvarekomponentene behandles.
Den egendefinerte komponenten for mellomvare logger detaljene til konsollen, og kaller deretter await next() for å sendes til neste komponent for mellomvare. Problemet er at StatusCode egenskapen til Response objektet er angitt etter at komponenten for terminal middleware starter svaret. La oss endre koden for å løse dette.
Flytt den
Console.WriteLine()linjen til etter denawait next()linjen i representanten du la til.Den oppdaterte koden skal se slik ut:
app.Use(async (context, next) => { await next(); Console.WriteLine($"{context.Request.Method} {context.Request.Path} {context.Response.StatusCode}"); });Nå loggfører den egendefinerte mellomvarekomponenten forespørselsdetaljene etter at komponenten for terminal-mellomvare angir statuskoden for svar.
Start på nytt, og test forespørselen
/historypå nytt. Utdataene Feilsøkingskonsoll skal nå vise riktig statuskode.GET / 200 GET /history 302 GET /about 200