Principy middlewaru
Účelem webové aplikace je přijímat požadavky HTTP a odpovídat na ně. Obdrží se požadavek a server vygeneruje příslušnou odpověď. Všechno v ASP.NET Core se zabývá tímto cyklem požadavků a odpovědí.
Když aplikace ASP.NET Core obdrží požadavek HTTP, projde řadou komponent pro vygenerování odpovědi. Tyto komponenty se nazývají middleware. Middleware si můžete představit jako kanál, kterým požadavek prochází, a každá vrstva middlewaru může spouštět kód před a za další vrstvou v kanálu.
Middleware a delegáti
Middleware je implementován jako delegát, který přebírá HttpContext objekt a vrací Task. Objekt HttpContext představuje aktuální požadavek a odpověď. Delegát je funkce, která zpracovává požadavek a odpověď.
Představte si například následující kód:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Run(async context =>
{
await context.Response.WriteAsync("Hello world!");
});
app.Run();
V předchozím kódu:
-
WebApplication.CreateBuilder(args)vytvoří novýWebApplicationBuilderobjekt. -
builder.Build()vytvoří novýWebApplicationobjekt. - První
app.Run()definuje delegáta, který přebíráHttpContextobjekt a vracíTaskhodnotu . Delegát do odpovědi napíše "Hello world!". -
app.Run()Druhá spustí aplikaci.
Když aplikace obdrží požadavek HTTP, zavolá se delegát. Delegát na odpověď napíše "Hello world!" a dokončí požadavek.
Řetězení middlewaru
Ve většině aplikací máte několik komponent middlewaru, které běží postupně. Pořadí, ve kterém do kanálu přidáváte komponenty middlewaru, je důležité. Komponenty se spouštějí v pořadí, v jakém byly přidány.
Terminálový a netermiální middleware
Každý middleware si můžete představit jako terminál nebo netermiální. Netermiální middleware zpracuje požadavek a potom zavolá další middleware v kanálu. Terminálový middleware je poslední middleware v kanálu a nemá další middleware, který se má volat.
Delegáti přidaní app.Use() pomocí terminálu nebo netermiálního middlewaru. Tito delegáti očekávají HttpContext objekt a RequestDelegate objekt jako parametry. Delegát obvykle zahrnuje await next.Invoke();. Tím se předá řízení dalšímu middlewaru v kanálu. Kód před tímto řádkem se spustí před dalším middlewarem a kód za tímto řádkem se spustí za dalším middlewarem. Delegát přidaný se dvěma možnostmi app.Use() , jak reagovat na požadavek před odesláním odpovědi klientovi; jednou před vygenerováním odpovědi terminálovým middlewarem a znovu po vygenerování odpovědi middlewarem terminálu.
Delegáti přidaní do app.Run() terminálu jsou vždy middleware terminálu. Nezavolají další middleware v kanálu. Jedná se o poslední komponentu middlewaru, která běží. Očekávají HttpContext pouze objekt jako parametr.
app.Run() je zkratka pro přidání middlewaru terminálu.
Představte si následující příklad:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Use(async (context, next) =>
{
await context.Response.WriteAsync("Hello from middleware 1. Passing to the next middleware!\r\n");
// Call the next middleware in the pipeline
await next.Invoke();
await context.Response.WriteAsync("Hello from middleware 1 again!\r\n");
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from middleware 2!\r\n");
});
app.Run();
V předchozím kódu:
-
app.Use()definuje komponentu middlewaru, která:- Píše "Hello z middlewaru 1. Předání do dalšího middlewaru!" do odpovědi.
- Předá požadavek do další komponenty middlewaru v kanálu a počká, až se dokončí .
await next.Invoke() - Po dokončení další komponenty v kanálu zapíše "Hello from middleware 1 again!" (Hello from middleware 1).
- První
app.Run()definuje komponentu middlewaru, která do odpovědi zapíše "Hello from middleware 2!" (Hello from middleware 2!). -
app.Run()Druhá spustí aplikaci.
Když webový prohlížeč za běhu odešle do této aplikace požadavek, spustí se komponenty middlewaru v pořadí, v jakém byly přidány do kanálu. Aplikace vrátí následující odpověď:
Hello from middleware 1. Passing to the next middleware!
Hello from middleware 2!
Hello from middleware 1 again!
Integrovaný middleware
ASP.NET Core poskytuje sadu integrovaných komponent middlewaru, které můžete použít k přidání běžných funkcí do aplikace. Kromě explicitně přidaných komponent middlewaru se pro vás ve výchozím nastavení implicitně přidá nějaký middleware. Například WebApplication.CreateBuilder() vrátí WebApplicationBuilder middleware směrování stránky výjimky vývojáře, podmíněně přidá ověřovací a autorizační middleware, pokud jsou nakonfigurované související služby, a přidá middleware směrování koncového bodu.
Představte si například následující soubor Program.cs :
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseAntiforgery();
app.MapStaticAssets();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
app.Run();
V předchozím kódu:
-
app.UseExceptionHandler()přidá komponentu middlewaru, která zachytí výjimky a vrátí chybovou stránku. -
app.UseHsts()přidá komponentu middlewaru, která nastaví hlavičku Strict-Transport-Security. -
app.UseHttpsRedirection()přidá komponentu middlewaru, která přesměruje požadavky HTTP na HTTPS. -
app.UseAntiforgery()přidá komponentu middlewaru, která brání útokům na útok CSRF (cross-site request forgery). -
app.MapStaticAssets()aapp.MapRazorComponents<App>()namapujte trasy na koncové body, které pak zpracovává middleware směrování koncového bodu. Middleware směrování koncového bodu implicitně přidáWebApplicationBuilder.
Existuje mnoho předdefinovaných komponent middlewaru, které můžete použít ve své aplikaci v závislosti na typu aplikace a vašich potřebách. Projděte si dokumentaci k úplnému seznamu.
Návod
V tomto kontextu jsou metody, které začínají Use obecně pro mapování middlewaru. Metody, které začínají Map , jsou obecně určené pro mapování koncových bodů.
Důležité
Komponenty middlewaru objednávek se přidávají do kanálu. Některé komponenty middlewaru musí běžet, aby ostatní správně fungovali. Zkontrolujte dokumentaci pro každou komponentu middlewaru a určete správné pořadí.