Oefening: aangepaste middleware maken

Voltooid

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:

Een diagram met de stroom van een aanvraag via de pijplijn.

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.

  1. Open het Program.cs-bestand als het nog niet is geopend.

  2. 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 een HttpContext object en een RequestDelegate object 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

  1. Druk op Ctrl+Shift+F5 om de app opnieuw te bouwen en opnieuw te starten.

  2. Wanneer het browservenster wordt geopend, ziet u dat in de hoofd-URL 'Welkom bij Contoso' wordt weergegeven.

  3. Voeg toe /history aan de URL en druk op Enter. De browser wordt omgeleid naar de /about pagina.

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

    De 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 /about pagina 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.

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

  1. Verplaats de app.Use() lijn die u direct vóór de app.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.

  2. Start de app opnieuw op en test deze als voorheen. Deze keer moet de uitvoer van de console voor foutopsporing de aanvraag voor de /history pagina bevatten.

    GET / 200
    GET /history 200
    GET /about 200
    

    In de console-uitvoer wordt nu de aanvraag voor de /history pagina weergegeven voordat deze wordt omgeleid naar de /about pagina.

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.

  1. Verplaats de Console.WriteLine() regel naar na de await 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.

  2. Start de aanvraag opnieuw en test deze /history opnieuw. In de uitvoer van de console voor foutopsporing moet nu de juiste statuscode worden weergegeven.

    GET / 200
    GET /history 302
    GET /about 200