Cvičení – vytvoření vlastního middlewaru
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:
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.
Otevřete soubor Program.cs , pokud ještě není otevřený.
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áHttpContextobjekt aRequestDelegateobjekt 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
Stisknutím kombinace kláves Ctrl+Shift+F5 aplikaci znovu sestavte a restartujte.
Po otevření okna prohlížeče si všimněte, že kořenová adresa URL zobrazí "Vítá vás Contoso!".
Přidejte
/historyna adresu URL a stiskněte Enter. Prohlížeč se přesměruje na/aboutstránku.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 200Vý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
/aboutstrá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.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.
app.Use()Přesuňte řádek, který jste přidali, bezprostředně předapp.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.
Restartujte aplikaci znovu a otestujte ji jako předtím. Tentokrát by výstup konzoly ladění měl obsahovat požadavek na
/historystránku.GET / 200 GET /history 200 GET /about 200Výstup konzoly teď před přesměrováním
/historyna/aboutstrá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.
V přidaném delegátu přesuňte
Console.WriteLine()řádek zaawait 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.
Restartujte a znovu otestujte
/historypožadavek. Výstup konzoly ladění by teď měl zobrazovat správný stavový kód.GET / 200 GET /history 302 GET /about 200