Övning – Skapa anpassade mellanprogram

Slutförd

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:

Ett diagram som visar flödet för en begäran via pipelinen.

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.

  1. Öppna filen Program.cs om den inte redan är öppen.

  2. 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 ett HttpContext objekt och ett RequestDelegate objekt 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

  1. Tryck på Ctrl+Skift+F5 för att återskapa och starta om appen.

  2. När webbläsarfönstret öppnas noterar du att rot-URL:en visar "Välkommen till Contoso!"

  3. Lägg till /history i URL:en och tryck på Retur. Webbläsaren omdirigeras till sidan /about .

  4. 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 200
    

    Konsolens 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 /about sidan.

    Kommentar

    Webbläsaren kan också begära /favicon.ico. Detta är en standardbegäran för en webbplats favicon och kan ignoreras.

  5. 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.

  1. Flytta den app.Use() rad som du lade till direkt före app.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.

  2. 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 /history sidan.

    GET / 200
    GET /history 200
    GET /about 200
    

    Konsolens utdata visar nu begäran för /history sidan 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.

  1. Flytta raden till efter Console.WriteLine() raden i ombudet som du har lagt await 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.

  2. Starta om och testa /history begäran igen. Felsökningskonsolens utdata bör nu visa rätt statuskod.

    GET / 200
    GET /history 302
    GET /about 200