Cvičení – vytvoření vlastního middlewaru

Dokončeno

Vývojáři můžou vytvářet vlastní komponenty middlewaru pro přidání funkcí do aplikace ASP.NET Core. Vlastní middleware se dá vložit kamkoli do kanálu middlewaru a dá se použít s integrovanými komponentami middlewaru, jak je vidět v tomto příkladu:

Diagram znázorňující tok požadavku přes kanál

Provozní tým vaší společnosti řeší problémy s výkonem v produkčním prostředí. Váš tým vás za úkol implementovat některé funkce, které vám pomůžou lépe podporovat monitorování aplikace v reálném čase. Aplikace by měla protokolovat podrobnosti žádosti o konzolu. Pro každý požadavek by měl protokolovat metodu požadavku, cestu a stavový kód odpovědi.

V tomto cvičení vytvoříte vlastní komponentu middlewaru, která do konzoly zaprokoluje podrobnosti požadavku.

Přidání vlastního middlewaru

Pojďme upravit existující aplikaci ASP.NET Core tak, aby obsahovala vlastní middleware, který do konzoly protokoluje podrobnosti žádosti.

  1. Otevřete soubor Program.cs , pokud ještě není otevřený.

  2. Bezprostředně před app.Run()vložte následující kód:

    app.Use(async (context, next) =>
    {
        Console.WriteLine($"{context.Request.Method} {context.Request.Path} {context.Response.StatusCode}");
        await next(); 
    });
    

    V předchozím kódu:

    • app.Use() přidá do kanálu vlastní komponentu middlewaru. Komponenta přebírá HttpContext objekt a RequestDelegate objekt jako parametry.
    • Delegát zapíše do konzoly metodu požadavku, cestu a stavový kód odpovědi.
    • await next() volá další komponentu middlewaru v kanálu.

Otestování změn

  1. Stisknutím kombinace kláves Ctrl+Shift+F5 aplikaci znovu sestavte a restartujte.

  2. Po otevření okna prohlížeče si všimněte, že kořenová adresa URL zobrazí "Vítá vás Contoso!".

  3. Přidejte /history na adresu URL a stiskněte Enter. Prohlížeč se přesměruje na /about stránku.

  4. V editoru Visual Studio Code stisknutím kombinace kláves Ctrl+Shift+P otevřete paletu příkazů. Vyhledejte a vyberte Konzolu ladění: Zaměřte se na zobrazení konzoly ladění a přepněte na kartu Konzola ladění v dolním panelu. Všimněte si následujících řádků:

    GET / 200
    GET /about 200
    

    Výstup konzoly zobrazuje metodu požadavku, cestu a stavový kód odpovědi pro každý požadavek. První řádek zobrazuje požadavek na kořenovou adresu URL a druhý řádek zobrazuje požadavek na /about stránku.

    Poznámka:

    Váš prohlížeč si také může vyžádat /favicon.ico. Toto je standardní žádost o favicon webu a dá se ignorovat.

  5. Nechte aplikaci spuštěnou pro další cvičení.

Změna pořadí middlewaru

Zdá se, že aplikace funguje, ale došlo k problému. Požádali jste o /history stránku, ale výstup konzoly ji nezobrazuje. Toto chování je způsobeno tím, že vlastní komponenta middlewaru, která protokoluje podrobnosti požadavku, byla přidána po middlewaru pro přepsání adresy URL. Middleware pro přepsání adresy URL přesměruje požadavky z /history adresy na /about odpověď a odešle odpověď a vlastní komponenta middlewaru požadavek nevidí. Pojďme to opravit.

  1. app.Use() Přesuňte řádek, který jste přidali, bezprostředně před app.UseRewriter() řádek.

    Úplný soubor Program.cs by měl vypadat takto:

    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();
    

    Teď se vlastní komponenta middlewaru přidá před middleware pro přepsání adresy URL. Vlastní komponenta middlewaru protokoluje podrobnosti požadavku před tím, než middleware pro přepsání adresy URL zpracuje požadavek a přesměruje ho.

  2. Restartujte aplikaci znovu a otestujte ji jako předtím. Tentokrát by výstup konzoly ladění měl obsahovat požadavek na /history stránku.

    GET / 200
    GET /history 200
    GET /about 200
    

    Výstup konzoly teď před přesměrováním /history na /about stránku zobrazí požadavek na stránku.

Oprava stavového kódu

Aplikace je téměř připravená, ale existuje ještě jeden problém. Stavový kód ve výstupu konzoly je vždy 200, i když aplikace přesměruje požadavek. Stavový kód /history požadavku by měl být přesměrování 302. Důvodem tohoto chování je další problém pořadí, ve kterém se zpracovávají komponenty middlewaru.

Vlastní komponenta middlewaru zaprokoluje podrobnosti do konzoly a pak zavolá await next() další komponentu middlewaru. Problém je, vlastnost objektu StatusCode je nastavena poté, Response co komponenta middlewaru terminálu spustí odpověď. Pojďme změnit kód, aby se tento problém vyřešil.

  1. V přidaném delegátu přesuňte Console.WriteLine() řádek za await next() řádek.

    Aktualizovaný kód by měl vypadat takto:

    app.Use(async (context, next) =>
    {
        await next(); 
        Console.WriteLine($"{context.Request.Method} {context.Request.Path} {context.Response.StatusCode}");
    });
    

    Vlastní komponenta middlewaru teď bude protokolovat podrobnosti požadavku poté, co komponenta middlewaru terminálu nastaví stavový kód odpovědi.

  2. Restartujte a znovu otestujte /history požadavek. Výstup konzoly ladění by teď měl zobrazovat správný stavový kód.

    GET / 200
    GET /history 302
    GET /about 200