Endpoint Routing v ASP.NET Core 3.0
Článek se vztahuje k verzi produktu ASP.NET Core 3.0
Tento článek byl napsán v roce 2019. Vývojářské technologie se neustále inovují a článek již nemusí popisovat aktuální stav technologie, ideální řešení a můj současný pohled na dané téma.
První podpora endpoint routingu byla přidána již do verze ASP.NET Core 2.2, avšak její použití bylo volitelné. Od verze ASP.NET Core 3.0 je endpoint routing výchozím mechanismem pro routování v celé aplikaci.
ASP.NET Core 2.x
ASP.NET Core je velmi modulární webový framework s podporou celé řady mechanismů, které se starají o zpracování webových requestů. Historicky vývojáři znají především MVC a Razor Pages, nicméně s verzí 3.0 přichází i podpora dalších druhů aplikací, jako Blazor nebo gRPC. Každý z těchto mechanismů potřebuje podporovat základní aplikační funkce, jako například response cache, autorizace nebo například cors. Tyto funkce se v různých mechanismech konfigurují různým způsobem. Například v MVC jsou velmi oblíbené atributy nad názvy controllerů a action metod.
Potíž je v tom, že když každý mechanismus řeší například autorizaci po svém a veškeré informace i rozhodovací procesy probíhají až na úrovni daného mechanismu. Tedy žádný middleware v ASP.NET Core aplikaci nemá tušení o tom, zda je aktuální request autorizovaný, jaká má pravidla cors, atd. To všechno se děje například až v rámci invocation pipeline v MVC.
ASP.NET Core 3.0+
Cílem ASP.NET Core týmu bylo, aby tyto obecné mechanismy bylo možné používat na obecnější úrovni. Tedy v MVC nebo Razor Pages nastavit například pravidla autorizace a tyto pravidla aktivovat nebo použít kdykoliv skrze libovolný (i vlastní) middleware.
Start aplikace
Všechny mechanismy mají společnou jednu věc. Pravidla routování včetně dalších atributů jsou známá již při startu aplikace. Dává tedy smysl během startu aplikace posbírat metadata ze všech registrovaných mechanismů a tyto data seškatulkovat do tzv. endpointů. To je přesně to, co se děje při startu aplikace při aktivaci Endpoint Middleware v ASP.NET Core 3.0.
app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
Request execution
Po nastartování aplikace můžeme do aplikace střílet requesty. Každý z requestů proteče skrze middleware pipeline a také dvěma middlewares, které řídí routing. Jsou registrovány voláním UseRouting() a UseEndpoints()
public void Configure(IApplicationBuilder app) { app.UseHttpsRedirection(); // ROUTING app.UseRouting(); app.UseAuthorization(); // EXECUTION app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
První middleware registrovaný přes UseRouting() má za úkol vzít informace z HttpContext.Request a na základě těchto údajů najít správný endpoint. Endpoint obsahuje informace o URL, vybrané http metodě a další informace sesbírané již při startu aplikace. Tento endpoint je následně uložen na HttpContextu. Od tohoto klíčového okamžiku tedy všechny další middlewares najdou na HttpContextu informace o endpointu a mohou si je vyzvednout voláním: HttpContext.GetEndpoint(). Můžete to ve svých middlewares dělat i vy.
Důsledkem je, že pokud používáte middleware, který pracuje se zmíněnými metadaty, musí se odbavit až po Endpoint Routing Middleware. V opačném případě daný middleware (třeba autorizační / cors) nebude mít k dispozici žádná pravidla ohledně autorizace.
Po odbavení všech middleware nakonec přijde řada na druhý middleware, který je registrován skrze volání UseEndpoints(). V rámci tohoto volání už pouze dochází k předání požadavku do cílového mechanismu (Razor Pages, MVC, atd.).
Závěr
Klíčovou změnou ve verzi 3.0 je vznik endpointů v rámci startu aplikace. Ty se v době provolání EndpointRouting middleware připojí k HttpRequestu a jsou přístupné pro všechny další middlewares. Předání do cílového mechanismu zajišťuje až Endpoint Middleware. Vývojář tak může psát vlastní middlewares a sahat si na různá metadata, která si nastaví v různých mechanismech, jako například v MVC skrze atributy...