Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Jegyzet
Ez nem a cikk legújabb verziója. Az aktuális kiadáshoz nézze meg a jelen cikk .NET 9-es verzióját.
Figyelmeztetés
A ASP.NET Core ezen verziója már nem támogatott. További információ: .NET és .NET Core támogatási szabályzat. Az aktuális kiadáshoz nézze meg a jelen cikk .NET 9-es verzióját.
Fontos
Ezek az információk egy olyan előzetes termékre vonatkoznak, amelyet a kereskedelmi forgalomba kerülés előtt jelentősen módosíthatnak. A Microsoft nem vállal kifejezett vagy hallgatólagos szavatosságot az itt megadott információkra vonatkozóan.
Az aktuális kiadáshoz nézze meg a jelen cikk .NET 9-es verzióját.
A middleware olyan szoftver, amely alkalmazási csővezetékbe van integrálva a kérések és válaszok kezelésére. Minden összetevő:
- Itt adhatja meg, hogy a kérést a folyamat következő összetevőjére kívánja-e továbbítani.
- A folyamat következő összetevője előtt és után is végezhet munkát.
A kérelemdelegáltak a kérelemfolyamat létrehozásához használhatók. A kérelem delegáltjai kezelik az egyes HTTP-kéréseket.
A kérésdelegáltak Run, Map, és Use bővítménymódszerekkel vannak konfigurálva. Az egyéni kérelemdelegáltak megadhatóak soron belül névtelen metódusként (úgynevezett in-line köztes szoftverként), vagy meghatározhatók egy újrafelhasználható osztályban. Ezek az újrahasználható osztályok és a soron belüli névtelen metódusok köztes szoftver, más néven köztes szoftverösszetevők. A kérelemfolyamat minden köztes szoftverösszetevője felelős a folyamat következő összetevőjének meghívásáért vagy a folyamat rövidzárolásáért. Amikor egy köztes szoftver lekapcsol, terminál köztes szoftvernek nevezik, mert megakadályozza a további köztes szoftverek kérésfeldolgozását.
A HTTP-modulok migrálása ASP.NET Core köztes szoftverbe elmagyarázza a ASP.NET Core kérésfolyamatai és a 4.x ASP.NET közötti különbséget, és további köztes szoftvermintákat biztosít.
A köztes szoftver szerepe alkalmazástípus szerint
Blazor Web Apps, Razor Pages és MVC folyamatböngésző kérések a kiszolgálón köztes szoftverrel. A cikkben szereplő útmutatás az ilyen típusú alkalmazásokra vonatkozik.
Az önálló Blazor WebAssembly-alkalmazások teljes egészében az ügyfélen futnak, és nem dolgozzák fel a kéréseket köztes szoftveres folyamattal. A cikkben szereplő útmutatás nem vonatkozik az önálló Blazor WebAssembly-alkalmazásokra.
Middleware kód elemzése
ASP.NET Core számos fordítóplatform-elemzőt tartalmaz, amelyek ellenőrzik az alkalmazás kódját a minőség szempontjából. További információ: Kódelemzés ASP.NET Core-alkalmazásokban
Köztes rétegbeli folyamatsor létrehozása WebApplication
A ASP.NET Core kérelemfolyamat a kérések delegáltjainak sorozatából áll, amelyet egymás után hívunk meg. Az alábbi ábra a koncepciót mutatja be. A végrehajtás szála a fekete nyilakat követi.
Minden meghatalmazott műveleteket hajthat végre a következő meghatalmazott előtt és után. A kivételkezelési meghatalmazottakat a folyamat korai szakaszában kell meghívni, hogy elkaphassák a folyamat későbbi szakaszaiban előforduló kivételeket.
A legegyszerűbb ASP.NET Core-alkalmazás egyetlen kérelemdelegáltat állít be, amely minden kérést kezel. Ez az eset nem tartalmaz tényleges kérelemfolyamatot. Ehelyett a rendszer egyetlen névtelen függvényt hív meg minden HTTP-kérésre válaszul.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Run(async context =>
{
await context.Response.WriteAsync("Hello world!");
});
app.Run();
Több kérelemdelegált összefűzése együtt a Use-val. A next
paraméter a folyamat következő delegáltját jelöli. A folyamat rövidre kapcsolásához nem meghívni a next
paramétert. Általában a next
delegált előtt és után is hajthat végre műveleteket, ahogy az alábbi példa is mutatja:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Use(async (context, next) =>
{
// Do work that can write to the Response.
await next.Invoke();
// Do logging or other work that doesn't write to the Response.
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from 2nd delegate.");
});
app.Run();
A kérelemfeldolgozás megszakítása
Ha egy meghatalmazott nem ad át kérést a következő meghatalmazottnak, megszakítják a kérések folyamatát. A rövidzárolás gyakran kívánatos, mert elkerüli a szükségtelen munkát. Például a statikus fájl közbensőterminálközvetítő lehet, ha feldolgoz egy statikus fájlra vonatkozó kérést, és megszakítja a folyamat többi részét. A folyamathoz hozzáadott köztes szoftver a további feldolgozást megszakító köztes szoftver előtt továbbra is feldolgozza a kódot a next.Invoke
utasítások után. Azonban tekintse meg a következő figyelmeztetést arról, hogy egy már elküldött válaszra próbál írni.
Figyelmeztetés
Ne hívja meg a next.Invoke
az ügyfélnek küldött válasz alatt vagy után. Egy HttpResponse elindítása után a módosítások kivételt eredményeznek. Például, ha a fejlécek és állapotkódok beállítása megtörténik, ezek kivételt dobnak azt követően, hogy a válasz elindult. Írás a választörzsbe a next
meghívása után:
- Protokollsértést okozhat, például ha a megadott
Content-Length
-nál többet ír. - A szövegtörzs formátuma megsérülhet, például HTML-láblécet írhat egy CSS-fájlba.
HasStarted egy hasznos tipp, amely jelzi, hogy a fejlécek elküldve lettek-e, vagy a törzs írása megtörtént-e.
További információ: Rövidzárlatú köztes szoftver az útválasztás után.
Run
meghatalmazottak
Run meghatalmazottak nem kapnak next
paramétert. Az első Run
delegált mindig végpont és lezárja az adatfolyamot.
Run
egy konvenció. Egyes köztes szoftverösszetevők Run[Middleware]
metódusokat tehetnek elérhetővé, amelyek a folyamat végén futnak:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Use(async (context, next) =>
{
// Do work that can write to the Response.
await next.Invoke();
// Do logging or other work that doesn't write to the Response.
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from 2nd delegate.");
});
app.Run();
Ha szeretné, hogy az angoltól eltérő nyelvekre is lefordítsuk a kódbejegyzéseket, jelezze nekünk a GitHub vitafórumának ebben aszámon szereplő témájában
Az előző példában a Run
képviselő "Hello from 2nd delegate."
ír a válaszba, majd megszakítja a csővezetéket. Ha a Use
delegált után egy másik Run
vagy Run
delegáltat adnak hozzá, azt nem hívják meg.
Részesítse előnyben az app.Use metódus túlterhelését, amely megköveteli a környezet továbbadását a következőre.
A memóriát nem foglaló app.Use kiterjesztési metódus:
- A környezet átadását igényli
next
részére. - Két belső kérésenkénti foglalást takarít meg, amelyek a másik túlterhelésű változat használatakor szükségesek.
További információ: a GitHub-probléma.
Köztes szoftver rendelése
Az alábbi ábra a ASP.NET Core MVC- és Razor Pages-alkalmazások teljes kérelemfeldolgozási folyamatát mutatja be. Láthatja, hogy egy tipikus alkalmazásban hogyan rendezik a meglévő köztes szoftvereket, és hol adnak hozzá egyéni köztes szoftvereket. Teljes körűen szabályozhatja, hogy miként rendezheti át a meglévő köztes szoftvereket, vagy hogyan szúrhat be új, egyéni köztes szoftvereket a forgatókönyvekhez szükséges módon.
Az előző ábrán szereplő végpont köztes szoftver a megfelelő alkalmazástípushoz (MVC vagy Razor Pages) tartozó szűrőfolyamatot hajtja végre.
Az előző ábrán látható Útválasztás köztes szoftver a Statikus fájlokkövetően van bemutatva. Ez az a sorrend, amelyet a projektsablonok implementálnak alkalmazás explicit meghívásával. UseRouting. Ha nem hívja meg app.UseRouting
, a Útválasztás köztes szoftver alapértelmezés szerint a folyamat elején fut. További információért lásd: Útválasztás.
A köztes szoftverösszetevők Program.cs
fájlban való hozzáadásának sorrendje határozza meg a köztes szoftver összetevőinek meghívásának sorrendjét a kérelmekben, valamint a válasz fordított sorrendjét. A sorrend kritikus a biztonság, teljesítmény és funkcionalitás szempontjából.
Az alábbi kiemelt kód Program.cs
a szokásos ajánlott sorrendben adja hozzá a biztonsághoz kapcsolódó köztes szoftverösszetevőket:
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebMiddleware.Data;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection")
?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
// app.UseCookiePolicy();
app.UseRouting();
// app.UseRateLimiter();
// app.UseRequestLocalization();
// app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
// app.UseSession();
// app.UseResponseCompression();
// app.UseResponseCaching();
app.MapRazorPages();
app.MapDefaultControllerRoute();
app.Run();
Az előző kódban:
- Az a köztes szoftver, amely nincs hozzáadva új webalkalmazások egyéni felhasználói fiókjainak létrehozása során, ki van kommentelve.
- Nem minden köztes szoftver jelenik meg pontosan ebben a sorrendben, de sokan igen. Például:
-
UseCors
,UseAuthentication
ésUseAuthorization
a megjelenített sorrendben kell megjelennie. -
UseCors
jelenlegUseResponseCaching
előtt kell megjelennie. Ezt a követelményt GitHub dotnet/aspnetcore #23218című témakör ismerteti. -
UseRequestLocalization
minden olyan köztes szoftver előtt meg kell jelennie, amely ellenőrizheti a kultúrát a kérésekben, példáulapp.UseStaticFiles()
. -
UseRateLimiter
UseRouting
után kell meghívni a végpontspecifikus API-k sebességkorlátozása esetén. Ha például a[EnableRateLimiting]
attribútumot használja,UseRateLimiter
UseRouting
után kell meghívni. Ha csak globális korlátokat hív meg,UseRateLimiter
hívható megUseRouting
előtt.
-
Bizonyos esetekben a köztes szoftver különböző sorrendben van. A gyorsítótárazás és a tömörítés sorrendje például az adott helyzethez igazodik, és több érvényes sorrend is létezik. Például:
app.UseResponseCaching();
app.UseResponseCompression();
Az előző kóddal a processzorhasználat csökkenthető a tömörített válasz gyorsítótárazásával, de előfordulhat, hogy egy erőforrás több ábrázolását is gyorsítótárazhatja különböző tömörítési algoritmusokkal, például a Gzip vagy a Brotli használatával.
A következő eljárás egyesíti a statikus fájlokat, lehetővé téve a tömörített statikus fájlok gyorsítótárazását.
app.UseResponseCaching();
app.UseResponseCompression();
app.UseStaticFiles();
Az alábbi Program.cs
kód köztes szoftverösszetevőket ad hozzá a gyakori alkalmazásforgatókönyvekhez:
- Kivétel/hibakezelés
- Amikor az alkalmazás a fejlesztési környezetben fut:
- A Fejlesztői Kivételkezelő Köztes Szoftver (UseDeveloperExceptionPage) jelenti az alkalmazás futási idejű hibáit.
- Adatbázis-hibaoldal köztes réteg (UseDatabaseErrorPage) az adatbázis futásidejű hibákat észleli.
- Amikor az alkalmazás éles környezetben fut:
- A Exception Handler Middleware (UseExceptionHandler) a következő köztes szoftverekben szereplő kivételeket rögzíti.
- HTTP Strict Transport Security Protocol (HSTS) Middleware (UseHsts) hozzáadja a
Strict-Transport-Security
fejlécet.
- Amikor az alkalmazás a fejlesztési környezetben fut:
- A HTTPS Redirection Middleware (UseHttpsRedirection) HTTP-kéréseket átirányít a HTTPS-be.
- A Static File Middleware (UseStaticFiles) statikus fájlokat szolgáltat, és megszakítja a kérelmek további feldolgozását.
- Cookie Policy Middleware (UseCookiePolicy) megfelel az alkalmazásnak az EU általános adatvédelmi rendeletének (GDPR) előírásainak.
- Útválasztási köztes szoftver (UseRouting) a kérések átirányításához.
- A hitelesítési köztes szoftver (UseAuthentication) megkísérli hitelesíteni a felhasználót, mielőtt hozzáférnének a biztonságos erőforrásokhoz.
- Az engedélyezési köztes szoftver (UseAuthorization) engedélyezi a felhasználó számára a biztonságos erőforrások elérését.
- A Session Middleware (UseSession) létrehozza és fenntartja a munkamenet állapotát. Ha az alkalmazás munkamenet-állapotot használ, hívja meg a Session Middleware-t a Policy Middleware Cookie és az MVC Middleware előtt.
- Az Endpoint Routing Middleware (UseEndpointsMapRazorPages) segítségével Razor Pages-végpontokat adhat hozzá a kérelemfolyamathoz.
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseSession();
app.MapRazorPages();
Az előző példakódban minden köztesszoftver-bővítménymetódus WebApplicationBuilder a Microsoft.AspNetCore.Builder névtéren keresztül jelenik meg.
UseExceptionHandler a folyamathoz hozzáadott első köztes szoftverösszetevő. Ezért a Exception Handler Middleware a későbbi hívások során előforduló kivételeket észleli.
A statikus fájl köztes réteget a csővezeték korai szakaszában hívjuk meg, hogy a fennmaradó összetevők megkerülésével kezelje a kéréseket és átugorja a folyamat részeit. A Static File Middleware nem biztosít engedélyezési ellenőrzéseket. A Static File Middleware által kiszolgált fájlok, beleértve a wwwrootalatti fájlokat is, nyilvánosan elérhetők. A statikus fájlok védelmének megközelítését a ASP.NET Core
Ha a kérést nem a statikus fájlközvetítő kezeli, a rendszer a hitelesítést végző middleware-nek (UseAuthentication) továbbítja. A hitelesítés nem hagyja figyelmen kívül a hitelesítés nélküli kéréseket. Bár a Hitelesítési köztes szoftver hitelesíti a kérelmeket, az engedélyezés (és az elutasítás) csak azután történik, hogy az MVC kiválaszt egy adott Razor lap- vagy MVC-vezérlőt és műveletet.
Az alábbi példa egy köztesszoftver-sorrendet mutat be, amelyben a statikus fájlokra vonatkozó kérelmeket a statikus fájlközvetítő kezeli a választömörítési köztes szoftver előtt. A statikus fájlok nem lesznek tömörítve ezzel a köztes szoftverrendelettel. A Razor lapokra adott válaszok tömöríthetők.
// Static files aren't compressed by Static File Middleware.
app.UseStaticFiles();
app.UseRouting();
app.UseResponseCompression();
app.MapRazorPages();
Az egyoldalas alkalmazásokról az ASP.NET Core
UseCors és UseStaticFiles sorrendje
A UseCors
és UseStaticFiles
hívásának sorrendje az alkalmazástól függ. További információ: UseCors és UseStaticFiles sorrend
Továbbított fejlécek köztes szoftver sorrendje
A továbbított fejlécek köztes szoftvernek a többi köztes szoftver előtt kell futnia. Ez a rendezés biztosítja, hogy a továbbított fejlécekre támaszkodó köztes szoftver feldolgozhassa a fejlécértékeket. A továbbított fejlécek köztes szoftver diagnosztikát és hibakezelést követő futtatásához lásd a Továbbított fejlécek köztes szoftver sorrendjerészt.
A köztes szoftverfolyamat elágaztatása
A Map kiterjesztések a csővezeték elágaztatásának konvenciójaként használatosak.
Map
elágaztatja a kérelemfolyamatot az adott kérelemútvonal egyezései alapján. Ha a kérelem elérési útja a megadott elérési úttal kezdődik, a rendszer végrehajtja az ágat.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Map("/map1", HandleMapTest1);
app.Map("/map2", HandleMapTest2);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
app.Run();
static void HandleMapTest1(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map Test 1");
});
}
static void HandleMapTest2(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map Test 2");
});
}
Az alábbi táblázat az előző kód használatával http://localhost:1234
kéréseit és válaszait mutatja be.
Kérés | Válasz |
---|---|
localhost:1234 | Üdvözlet a nem-térkép delegáltjától. |
localhost:1234/map1 | Térképteszt 1 |
localhost:1234/map2 | Térképteszt 2 |
localhost:1234/map3 | Üdvözlet a nem-térkép delegáltjától. |
Ha a(z) Map
-t használnak, eltávolítják a megfeleltetett elérésiút-szegmenseket a HttpRequest.Path
-ből, és hozzáfűzik a HttpRequest.PathBase
-höz minden kérésnél.
Map
például támogatja a beágyazást:
app.Map("/level1", level1App => {
level1App.Map("/level2a", level2AApp => {
// "/level1/level2a" processing
});
level1App.Map("/level2b", level2BApp => {
// "/level1/level2b" processing
});
});
Map
egyszerre több szegmensnek is megfelelhet:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Map("/map1/seg1", HandleMultiSeg);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
app.Run();
static void HandleMultiSeg(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map Test 1");
});
}
MapWhen elágaztatja a kérelemfolyamatot az adott predikátum eredménye alapján. A bármilyen Func<HttpContext, bool>
típusú predikátum felhasználható a kérések folyamat egy új ágára való leképezésére. Az alábbi példában egy predikátumot használunk egy lekérdezési sztringváltozó jelenlétének észlelésére branch
:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapWhen(context => context.Request.Query.ContainsKey("branch"), HandleBranch);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
app.Run();
static void HandleBranch(IApplicationBuilder app)
{
app.Run(async context =>
{
var branchVer = context.Request.Query["branch"];
await context.Response.WriteAsync($"Branch used = {branchVer}");
});
}
Az alábbi táblázat az előző kód használatával http://localhost:1234
kéréseit és válaszait mutatja be:
Kérés | Válasz |
---|---|
localhost:1234 |
Hello from non-Map delegate. |
localhost:1234/?branch=main |
Branch used = main |
UseWhen a kérelemfolyamatot is elágaztatja az adott predikátum eredménye alapján. A MapWhen
ellentétben ez az ág újra csatlakozik a fő folyamathoz, ha nem tartalmaz terminál köztes szoftvereket:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseWhen(context => context.Request.Query.ContainsKey("branch"),
appBuilder => HandleBranchAndRejoin(appBuilder));
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
app.Run();
void HandleBranchAndRejoin(IApplicationBuilder app)
{
var logger = app.ApplicationServices.GetRequiredService<ILogger<Program>>();
app.Use(async (context, next) =>
{
var branchVer = context.Request.Query["branch"];
logger.LogInformation("Branch used = {branchVer}", branchVer);
// Do work that doesn't write to the Response.
await next();
// Do other work that doesn't write to the Response.
});
}
Az előző példában a Hello from non-Map delegate.
válasza minden kéréshez meg van írva. Ha a kérés tartalmaz egy branch
lekérdezési sztringváltozót, annak értékét a rendszer naplózza a főfolyamat újbóli összekapcsolása előtt.
Beépített köztes szoftver
Az ASP.NET Core a következő middleware komponenseket tartalmazza. A Order oszlop a köztes szoftvernek a kérelemfeldolgozási folyamatban való elhelyezésével kapcsolatos megjegyzéseket tartalmaz, valamint azt, hogy a köztes szoftver milyen feltételek mellett fejezheti be a kérelmek feldolgozását. Amikor egy köztes szoftver rövidzárlatot ad a kérésfeldolgozó folyamatnak, és megakadályozza a további alsóbb rétegbeli köztes szoftvereket a kérések feldolgozásában, terminál köztes szoftvernek nevezzük. További információ a rövidzárolásról a WebApplication köztes szoftveres folyamat létrehozása című részben található.
Köztes szoftver | Leírás | Megrendelés |
---|---|---|
Hamisítás elleni védelem | Kérés-hamisítás elleni támogatást nyújt. | Hitelesítés és engedélyezés után, végpontok előtt. |
Hitelesítés | Hitelesítési támogatást nyújt. | Mielőtt szükség lenne HttpContext.User -ra. OAuth-visszahívások terminálja. |
Engedélyezés | Engedélyezési támogatást nyújt. | Közvetlenül a hitelesítési köztes szoftver után. |
Cookie szabályzat | Nyomon követi a felhasználók hozzájárulását a személyes adatok tárolásához, és betartatja cookie mezőkre vonatkozó minimális szabványokat, például secure és SameSite . |
A köztes szoftver előtt, amely cookie-kat ad ki. Példák: Hitelesítés, Munkamenet, MVC (TempData). |
CORS | A forrásközi erőforrásmegosztást konfigurálja. | A CORS-t használó összetevők előtt.
UseCors jelenleg UseResponseCaching miatt, előtt kell lennie. |
FejlesztőiKivételOldal | Létrehoz egy olyan oldalt, amelyen hibainformációk találhatók, amelyek csak a fejlesztési környezetben való használatra szolgálnak. | A hibákat generáló összetevők előtt. A projektsablonok automatikusan regisztrálják ezt a köztes szoftvert a folyamat első köztes szoftvereként, amikor a környezet fejlesztés. |
Diagnosztikai | Több különálló köztes szoftver, amely fejlesztői kivételoldalt, kivételkezelést, állapotkódlapokat és az új alkalmazások alapértelmezett weblapját biztosítja. | A hibákat generáló összetevők előtt. Terminál a kivételekhez, vagy az új alkalmazások alapértelmezett weblapjának kiszolgálása. |
továbbított fejlécek | Továbbítja a proxizált fejléceket az aktuális kéréshez. | A frissített mezőket felhasználó komponensek előtt. Példák: séma, gazdagép, ügyfél IP-címe, módszer. |
Egészségügyi ellenőrzés | Ellenőrzi egy ASP.NET Core-alkalmazás állapotát és függőségeit, például az adatbázis rendelkezésre állásának ellenőrzését. | Terminál, ha egy kérés megfelel egy állapot-ellenőrzési végpontnak. |
Fejléc terjesztése | Propagálja a HTTP-fejléceket a bejövő kérésből a kimenő HTTP-ügyfélkérelmekbe. | |
HTTP-naplózás | HTTP-kéréseket és válaszokat naplóz. | A middleware folyamatának elején. |
HTTP-metódus felülbírálása | Lehetővé teszi, hogy egy bejövő POST-kérés felülbírálja a metódust. | A frissített metódust használó összetevők előtt. |
HTTPS-átirányítás | Az összes HTTP-kérés átirányítása HTTPS-be. | Az URL-t fogyasztó összetevők előtt. |
HTTP szigorú átviteli biztonsági (HSTS) | Biztonsági fejlesztést biztosító köztes szoftver, amely hozzáad egy speciális válaszfejlécet. | A válaszok elküldése előtt és a kéréseket módosító összetevők után. Példák: Továbbított fejlécek, URL-átírás. |
MVC | MVC/Razor pages használatával dolgozza fel a kérelmeket. | Terminál, ha egy kérés megfelel egy útvonalnak. |
OWIN | Együttműködés OWIN-alapú alkalmazásokkal, kiszolgálókkal és köztes szoftverekkel. | Terminál, ha az OWIN Middleware teljes mértékben feldolgozza a kérést. |
Kimeneti gyorsítótárazás | Támogatja a konfiguráción alapuló gyorsítótárazási válaszokat. | Gyorsítótárazást igénylő összetevők előtt.
UseRouting
UseOutputCaching előtt kell lennie.
UseCORS
UseOutputCaching előtt kell lennie. |
válasz gyorsítótárazása | Támogatást nyújt a gyorsítótárazási válaszokhoz. Ehhez az ügyfél részvétele szükséges. A teljes kiszolgálóvezérléshez használjon kimeneti gyorsítótárazást. | Gyorsítótárazást igénylő összetevők előtt.
UseCORS
UseResponseCaching előtt kell lennie. Általában nem előnyös az olyan felhasználói felületi alkalmazások esetében, mint a Razor Pages, mivel a böngészők általában olyan kérésfejléceket állítanak be, amelyek megakadályozzák a gyorsítótárazást.
Kimeneti gyorsítótárazás előnyös a felhasználói felületű alkalmazásoknak. |
Dekompresszió kérése | Támogatást nyújt a kérések kitömörítéséhez. | A kérelem törzsét olvasó összetevők előtt. |
Választömörítés | Támogatja a válaszok tömörítését. | A tömörítést igénylő összetevők előtt. |
Honosítási kérelem | Honosítási támogatást nyújt. | A honosítás előtt az érzékeny összetevőket. Az útválasztás köztes szoftver után kell megjelennie RouteDataRequestCultureProvider használatakor. |
Kérelem időtúllépés | Támogatást nyújt a kérelmek időtúllépéseinek konfigurálásához globálisan és végpontonként. |
UseRequestTimeouts
UseExceptionHandler , UseDeveloperExceptionPage és UseRouting után kell érkeznie . |
Végpont-útválasztás | Meghatározza és korlátozza a kérési útvonalakat. | Az útvonalak illesztésére szolgáló terminál. |
GYÓGYFÜRDŐ | A köztes szoftverlánc ezen pontjáról érkező összes kérést az egyoldalas alkalmazás (SPA) alapértelmezett oldalának visszaadásával kezeli. | A lánc későbbi részében, így a statikus fájlok, MVC-műveletek stb. kiszolgálására szolgáló többi köztes szoftver elsőbbséget kap. |
szekció | Támogatást nyújt a felhasználói munkamenetek kezeléséhez. | A munkamenetet igénylő összetevők előtt. |
statikus fájlok |
Támogatja a statikus fájlok és a címtárböngészés kiszolgálását. | Terminál, ha egy kérés egy fájlnak felel meg. |
URL-cím átírása | Támogatja az URL-címek újraírását és a kérések átirányítását. | Az URL-t fogyasztó összetevők előtt. |
W3CLogging | Kiszolgálóelérési naplókat hoz létre a W3C bővített naplófájlformátumú. | A middleware folyamatának elején. |
WebSockets | Engedélyezi a WebSockets protokollt. | A WebSocket-kérelmek elfogadásához szükséges összetevők előtt. |
További erőforrások
- élettartam- és regisztrációs lehetőségek a köztes szoftver teljes mintáját tartalmazza, hatókörrel rendelkező, átmenetiés egyszeri élettartam-szolgáltatásokkal.
- Egyéni ASP.NET Core köztes szoftver írása
- ASP.NET Core köztes szoftver tesztelése
- gRPC-Web konfigurálása az ASP.NET Core-ban
- HTTP-modulok migrálása ASP.NET Core köztes szoftverbe
- alkalmazás indítása a ASP.NET Core
- Kért funkciók az ASP.NET Core-ban
- Factory alapú middleware aktiválás ASP.NET Core-ban
- Köztes szoftver aktiválása harmadik féltől származó tárolóval az ASP.NET Core
A middleware olyan szoftver, amely alkalmazási csővezetékbe van integrálva a kérések és válaszok kezelésére. Minden összetevő:
- Itt adhatja meg, hogy a kérést a folyamat következő összetevőjére kívánja-e továbbítani.
- A folyamat következő összetevője előtt és után is végezhet munkát.
A kérelemdelegáltak a kérelemfolyamat létrehozásához használhatók. A kérelem delegáltjai kezelik az egyes HTTP-kéréseket.
A kérésdelegáltak Run, Map, és Use bővítménymódszerekkel vannak konfigurálva. Az egyéni kérelemdelegáltak megadhatóak soron belül névtelen metódusként (úgynevezett in-line köztes szoftverként), vagy meghatározhatók egy újrafelhasználható osztályban. Ezek az újrahasználható osztályok és a soron belüli névtelen metódusok köztes szoftver, más néven köztes szoftverösszetevők. A kérelemfolyamat minden köztes szoftverösszetevője felelős a folyamat következő összetevőjének meghívásáért vagy a folyamat rövidzárolásáért. Amikor egy köztes szoftver lekapcsol, terminál köztes szoftvernek nevezik, mert megakadályozza a további köztes szoftverek kérésfeldolgozását.
A HTTP-modulok migrálása ASP.NET Core köztes szoftverbe elmagyarázza a ASP.NET Core kérésfolyamatai és a 4.x ASP.NET közötti különbséget, és további köztes szoftvermintákat biztosít.
A köztes szoftver szerepe alkalmazástípus szerint
Razor Pages, MVC, Blazor Server, valamint egy üzemeltetett Blazor WebAssembly megoldás szerveroldali projektje köztes szoftverekkel dolgozza fel a böngészői kéréseket a szerveren. A cikkben szereplő útmutatás az ilyen típusú alkalmazásokra vonatkozik.
Az önálló Blazor WebAssembly-alkalmazások teljes egészében az ügyfélen futnak, és nem dolgozzák fel a kéréseket köztes szoftveres folyamattal. A cikkben szereplő útmutatás nem vonatkozik az önálló Blazor WebAssembly-alkalmazásokra.
Middleware kód elemzése
ASP.NET Core számos fordítóplatform-elemzőt tartalmaz, amelyek ellenőrzik az alkalmazás kódját a minőség szempontjából. További információ: Kódelemzés ASP.NET Core-alkalmazásokban
Köztes rétegbeli folyamatsor létrehozása WebApplication
A ASP.NET Core kérelemfolyamat a kérések delegáltjainak sorozatából áll, amelyet egymás után hívunk meg. Az alábbi ábra a koncepciót mutatja be. A végrehajtás szála a fekete nyilakat követi.
Minden meghatalmazott műveleteket hajthat végre a következő meghatalmazott előtt és után. A kivételkezelési meghatalmazottakat a folyamat korai szakaszában kell meghívni, hogy elkaphassák a folyamat későbbi szakaszaiban előforduló kivételeket.
A legegyszerűbb ASP.NET Core-alkalmazás egyetlen kérelemdelegáltat állít be, amely minden kérést kezel. Ez az eset nem tartalmaz tényleges kérelemfolyamatot. Ehelyett a rendszer egyetlen névtelen függvényt hív meg minden HTTP-kérésre válaszul.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Run(async context =>
{
await context.Response.WriteAsync("Hello world!");
});
app.Run();
Több kérelemdelegált összefűzése együtt a Use-val. A next
paraméter a folyamat következő delegáltját jelöli. A folyamat rövidre kapcsolásához nem meghívni a next
paramétert. Általában a next
delegált előtt és után is hajthat végre műveleteket, ahogy az alábbi példa is mutatja:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Use(async (context, next) =>
{
// Do work that can write to the Response.
await next.Invoke();
// Do logging or other work that doesn't write to the Response.
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from 2nd delegate.");
});
app.Run();
Ha egy meghatalmazott nem ad át kérést a következő meghatalmazottnak, megszakítják a kérések folyamatát. A rövidzárolás gyakran kívánatos, mert elkerüli a szükségtelen munkát. Például a statikus fájl közbensőterminálközvetítő lehet, ha feldolgoz egy statikus fájlra vonatkozó kérést, és megszakítja a folyamat többi részét. A folyamathoz hozzáadott köztes szoftver a további feldolgozást megszakító köztes szoftver előtt továbbra is feldolgozza a kódot a next.Invoke
utasítások után. Azonban tekintse meg a következő figyelmeztetést arról, hogy egy már elküldött válaszra próbál írni.
Figyelmeztetés
Ne hívjon next.Invoke
, miután a válasz el lett küldve az ügyfélnek. A HttpResponse módosítása, miután a válasz megkezdődött, kivételt okoz. Például a fejlécek és állapotkódok beállítása kivételt dob. Írás a választörzsbe a next
meghívása után:
- Protokollsértést okozhat. Például, ha több szöveget ír be, mint a megadott
Content-Length
. - A szövegtörzs formátuma megsérülhet. Például egy HTML lábléc írása egy CSS-fájlba.
HasStarted egy hasznos tipp, amely jelzi, hogy a fejlécek elküldve lettek-e, vagy a törzs írása megtörtént-e.
Run meghatalmazottak nem kapnak next
paramétert. Az első Run
delegált mindig végpont és lezárja az adatfolyamot.
Run
egy konvenció. Egyes köztes szoftverösszetevők Run[Middleware]
metódusokat tehetnek elérhetővé, amelyek a folyamat végén futnak:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Use(async (context, next) =>
{
// Do work that can write to the Response.
await next.Invoke();
// Do logging or other work that doesn't write to the Response.
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from 2nd delegate.");
});
app.Run();
Ha szeretné, hogy az angoltól eltérő nyelvekre is lefordítsuk a kódbejegyzéseket, jelezze nekünk a GitHub vitafórumának ebben aszámon szereplő témájában
Az előző példában a Run
képviselő "Hello from 2nd delegate."
ír a válaszba, majd megszakítja a csővezetéket. Ha a Use
delegált után egy másik Run
vagy Run
delegáltat adnak hozzá, azt nem hívják meg.
Részesítse előnyben az app.Use metódus túlterhelését, amely megköveteli a környezet továbbadását a következőre.
A memóriát nem foglaló app.Use kiterjesztési metódus:
- A környezet átadását igényli
next
részére. - Két belső kérésenkénti foglalást takarít meg, amelyek a másik túlterhelésű változat használatakor szükségesek.
További információ: a GitHub-probléma.
Köztes szoftver rendelése
Az alábbi ábra a ASP.NET Core MVC- és Razor Pages-alkalmazások teljes kérelemfeldolgozási folyamatát mutatja be. Láthatja, hogy egy tipikus alkalmazásban hogyan rendezik a meglévő köztes szoftvereket, és hol adnak hozzá egyéni köztes szoftvereket. Teljes körűen szabályozhatja, hogy miként rendezheti át a meglévő köztes szoftvereket, vagy hogyan szúrhat be új, egyéni köztes szoftvereket a forgatókönyvekhez szükséges módon.
Az előző ábrán szereplő végpont köztes szoftver a megfelelő alkalmazástípushoz (MVC vagy Razor Pages) tartozó szűrőfolyamatot hajtja végre.
Az előző ábrán látható Útválasztás köztes szoftver a Statikus fájlokkövetően van bemutatva. Ez az a sorrend, amelyet a projektsablonok implementálnak alkalmazás explicit meghívásával. UseRouting. Ha nem hívja meg app.UseRouting
, a Útválasztás köztes szoftver alapértelmezés szerint a folyamat elején fut. További információért lásd: Útválasztás.
A köztes szoftverösszetevők Program.cs
fájlban való hozzáadásának sorrendje határozza meg a köztes szoftver összetevőinek meghívásának sorrendjét a kérelmekben, valamint a válasz fordított sorrendjét. A sorrend kritikus a biztonság, teljesítmény és funkcionalitás szempontjából.
Az alábbi kiemelt kód Program.cs
a szokásos ajánlott sorrendben adja hozzá a biztonsághoz kapcsolódó köztes szoftverösszetevőket:
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebMiddleware.Data;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection")
?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
// app.UseCookiePolicy();
app.UseRouting();
// app.UseRateLimiter();
// app.UseRequestLocalization();
// app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
// app.UseSession();
// app.UseResponseCompression();
// app.UseResponseCaching();
app.MapRazorPages();
app.MapDefaultControllerRoute();
app.Run();
Az előző kódban:
- Az a köztes szoftver, amely nincs hozzáadva új webalkalmazások egyéni felhasználói fiókjainak létrehozása során, ki van kommentelve.
- Nem minden köztes szoftver jelenik meg pontosan ebben a sorrendben, de sokan igen. Például:
-
UseCors
,UseAuthentication
ésUseAuthorization
a megjelenített sorrendben kell megjelennie. -
UseCors
jelenlegUseResponseCaching
előtt kell megjelennie. Ezt a követelményt GitHub dotnet/aspnetcore #23218című témakör ismerteti. -
UseRequestLocalization
minden olyan köztes szoftver előtt meg kell jelennie, amely ellenőrizheti a kultúrát a kérésekben, példáulapp.UseStaticFiles()
. -
UseRateLimiter
UseRouting
után kell meghívni a végpontspecifikus API-k sebességkorlátozása esetén. Ha például a[EnableRateLimiting]
attribútumot használja,UseRateLimiter
UseRouting
után kell meghívni. Ha csak globális korlátokat hív meg,UseRateLimiter
hívható megUseRouting
előtt.
-
Bizonyos esetekben a köztes szoftver különböző sorrendben van. A gyorsítótárazás és a tömörítés sorrendje például az adott helyzethez igazodik, és több érvényes sorrend is létezik. Például:
app.UseResponseCaching();
app.UseResponseCompression();
Az előző kóddal a processzorhasználat csökkenthető a tömörített válasz gyorsítótárazásával, de előfordulhat, hogy egy erőforrás több ábrázolását is gyorsítótárazhatja különböző tömörítési algoritmusokkal, például a Gzip vagy a Brotli használatával.
A következő eljárás egyesíti a statikus fájlokat, lehetővé téve a tömörített statikus fájlok gyorsítótárazását.
app.UseResponseCaching();
app.UseResponseCompression();
app.UseStaticFiles();
Az alábbi Program.cs
kód köztes szoftverösszetevőket ad hozzá a gyakori alkalmazásforgatókönyvekhez:
- Kivétel/hibakezelés
- Amikor az alkalmazás a fejlesztési környezetben fut:
- A Fejlesztői Kivételkezelő Köztes Szoftver (UseDeveloperExceptionPage) jelenti az alkalmazás futási idejű hibáit.
- Adatbázis-hibaoldal köztes réteg (UseDatabaseErrorPage) az adatbázis futásidejű hibákat észleli.
- Amikor az alkalmazás éles környezetben fut:
- A Exception Handler Middleware (UseExceptionHandler) a következő köztes szoftverekben szereplő kivételeket rögzíti.
- HTTP Strict Transport Security Protocol (HSTS) Middleware (UseHsts) hozzáadja a
Strict-Transport-Security
fejlécet.
- Amikor az alkalmazás a fejlesztési környezetben fut:
- A HTTPS Redirection Middleware (UseHttpsRedirection) HTTP-kéréseket átirányít a HTTPS-be.
- A Static File Middleware (UseStaticFiles) statikus fájlokat szolgáltat, és megszakítja a kérelmek további feldolgozását.
- Cookie Policy Middleware (UseCookiePolicy) megfelel az alkalmazásnak az EU általános adatvédelmi rendeletének (GDPR) előírásainak.
- Útválasztási köztes szoftver (UseRouting) a kérések átirányításához.
- A hitelesítési köztes szoftver (UseAuthentication) megkísérli hitelesíteni a felhasználót, mielőtt hozzáférnének a biztonságos erőforrásokhoz.
- Az engedélyezési köztes szoftver (UseAuthorization) engedélyezi a felhasználó számára a biztonságos erőforrások elérését.
- A Session Middleware (UseSession) létrehozza és fenntartja a munkamenet állapotát. Ha az alkalmazás munkamenet-állapotot használ, hívja meg a Session Middleware-t a Policy Middleware Cookie és az MVC Middleware előtt.
- Az Endpoint Routing Middleware (UseEndpointsMapRazorPages) segítségével Razor Pages-végpontokat adhat hozzá a kérelemfolyamathoz.
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseSession();
app.MapRazorPages();
Az előző példakódban minden köztesszoftver-bővítménymetódus WebApplicationBuilder a Microsoft.AspNetCore.Builder névtéren keresztül jelenik meg.
UseExceptionHandler a folyamathoz hozzáadott első köztes szoftverösszetevő. Ezért a Exception Handler Middleware a későbbi hívások során előforduló kivételeket észleli.
A statikus fájl köztes réteget a csővezeték korai szakaszában hívjuk meg, hogy a fennmaradó összetevők megkerülésével kezelje a kéréseket és átugorja a folyamat részeit. A Static File Middleware nem biztosít engedélyezési ellenőrzéseket. A Static File Middleware által kiszolgált fájlok, beleértve a wwwrootalatti fájlokat is, nyilvánosan elérhetők. A statikus fájlok védelmének megközelítését a ASP.NET Core
Ha a kérést nem a statikus fájlközvetítő kezeli, a rendszer a hitelesítést végző middleware-nek (UseAuthentication) továbbítja. A hitelesítés nem hagyja figyelmen kívül a hitelesítés nélküli kéréseket. Bár a Hitelesítési köztes szoftver hitelesíti a kérelmeket, az engedélyezés (és az elutasítás) csak azután történik, hogy az MVC kiválaszt egy adott Razor lap- vagy MVC-vezérlőt és műveletet.
Az alábbi példa egy köztesszoftver-sorrendet mutat be, amelyben a statikus fájlokra vonatkozó kérelmeket a statikus fájlközvetítő kezeli a választömörítési köztes szoftver előtt. A statikus fájlok nem lesznek tömörítve ezzel a köztes szoftverrendelettel. A Razor lapokra adott válaszok tömöríthetők.
// Static files aren't compressed by Static File Middleware.
app.UseStaticFiles();
app.UseRouting();
app.UseResponseCompression();
app.MapRazorPages();
Az egyoldalas alkalmazásokról a React és Angular projektsablonok útmutatóiban talál további információt.
UseCors és UseStaticFiles sorrendje
A UseCors
és UseStaticFiles
hívásának sorrendje az alkalmazástól függ. További információ: UseCors és UseStaticFiles sorrend
Továbbított fejlécek köztes szoftver sorrendje
A továbbított fejlécek köztes szoftvernek a többi köztes szoftver előtt kell futnia. Ez a rendezés biztosítja, hogy a továbbított fejlécekre támaszkodó köztes szoftver feldolgozhassa a fejlécértékeket. A továbbított fejlécek köztes szoftver diagnosztikát és hibakezelést követő futtatásához lásd a Továbbított fejlécek köztes szoftver sorrendjerészt.
A köztes szoftverfolyamat elágaztatása
A Map kiterjesztések a csővezeték elágaztatásának konvenciójaként használatosak.
Map
elágaztatja a kérelemfolyamatot az adott kérelemútvonal egyezései alapján. Ha a kérelem elérési útja a megadott elérési úttal kezdődik, a rendszer végrehajtja az ágat.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Map("/map1", HandleMapTest1);
app.Map("/map2", HandleMapTest2);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
app.Run();
static void HandleMapTest1(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map Test 1");
});
}
static void HandleMapTest2(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map Test 2");
});
}
Az alábbi táblázat az előző kód használatával http://localhost:1234
kéréseit és válaszait mutatja be.
Kérés | Válasz |
---|---|
localhost:1234 | Üdvözlet a nem-térkép delegáltjától. |
localhost:1234/map1 | Térképteszt 1 |
localhost:1234/map2 | Térképteszt 2 |
localhost:1234/map3 | Üdvözlet a nem-térkép delegáltjától. |
Ha a(z) Map
-t használnak, eltávolítják a megfeleltetett elérésiút-szegmenseket a HttpRequest.Path
-ből, és hozzáfűzik a HttpRequest.PathBase
-höz minden kérésnél.
Map
például támogatja a beágyazást:
app.Map("/level1", level1App => {
level1App.Map("/level2a", level2AApp => {
// "/level1/level2a" processing
});
level1App.Map("/level2b", level2BApp => {
// "/level1/level2b" processing
});
});
Map
egyszerre több szegmensnek is megfelelhet:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Map("/map1/seg1", HandleMultiSeg);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
app.Run();
static void HandleMultiSeg(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map Test 1");
});
}
MapWhen elágaztatja a kérelemfolyamatot az adott predikátum eredménye alapján. A bármilyen Func<HttpContext, bool>
típusú predikátum felhasználható a kérések folyamat egy új ágára való leképezésére. Az alábbi példában egy predikátumot használunk egy lekérdezési sztringváltozó jelenlétének észlelésére branch
:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapWhen(context => context.Request.Query.ContainsKey("branch"), HandleBranch);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
app.Run();
static void HandleBranch(IApplicationBuilder app)
{
app.Run(async context =>
{
var branchVer = context.Request.Query["branch"];
await context.Response.WriteAsync($"Branch used = {branchVer}");
});
}
Az alábbi táblázat az előző kód használatával http://localhost:1234
kéréseit és válaszait mutatja be:
Kérés | Válasz |
---|---|
localhost:1234 |
Hello from non-Map delegate. |
localhost:1234/?branch=main |
Branch used = main |
UseWhen a kérelemfolyamatot is elágaztatja az adott predikátum eredménye alapján. A MapWhen
-val ellentétben ez az ág újra csatlakozik a fő folyamathoz, ha nem okoz rövidzárlatot, vagy nem tartalmaz terminálközvetítőt.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseWhen(context => context.Request.Query.ContainsKey("branch"),
appBuilder => HandleBranchAndRejoin(appBuilder));
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
app.Run();
void HandleBranchAndRejoin(IApplicationBuilder app)
{
var logger = app.ApplicationServices.GetRequiredService<ILogger<Program>>();
app.Use(async (context, next) =>
{
var branchVer = context.Request.Query["branch"];
logger.LogInformation("Branch used = {branchVer}", branchVer);
// Do work that doesn't write to the Response.
await next();
// Do other work that doesn't write to the Response.
});
}
Az előző példában a Hello from non-Map delegate.
válasza minden kéréshez meg van írva. Ha a kérés tartalmaz egy branch
lekérdezési sztringváltozót, annak értékét a rendszer naplózza a főfolyamat újbóli összekapcsolása előtt.
Beépített köztes szoftver
Az ASP.NET Core a következő middleware komponenseket tartalmazza. A Order oszlop a köztes szoftvernek a kérelemfeldolgozási folyamatban való elhelyezésével kapcsolatos megjegyzéseket tartalmaz, valamint azt, hogy a köztes szoftver milyen feltételek mellett fejezheti be a kérelmek feldolgozását. Amikor egy köztes szoftver rövidzárlatot ad a kérésfeldolgozó folyamatnak, és megakadályozza a további alsóbb rétegbeli köztes szoftvereket a kérések feldolgozásában, terminál köztes szoftvernek nevezzük. További információ a rövidzárolásról a WebApplication köztes szoftveres folyamat létrehozása című részben található.
Köztes szoftver | Leírás | Megrendelés |
---|---|---|
Hitelesítés | Hitelesítési támogatást nyújt. | Mielőtt szükség lenne HttpContext.User -ra. OAuth-visszahívások terminálja. |
Engedélyezés | Engedélyezési támogatást nyújt. | Közvetlenül a hitelesítési köztes szoftver után. |
Cookie szabályzat | Nyomon követi a felhasználók hozzájárulását a személyes adatok tárolásához, és betartatja cookie mezőkre vonatkozó minimális szabványokat, például secure és SameSite . |
A köztes szoftver előtt, amely cookie-kat ad ki. Példák: Hitelesítés, Munkamenet, MVC (TempData). |
CORS | A forrásközi erőforrásmegosztást konfigurálja. | A CORS-t használó összetevők előtt.
UseCors jelenleg UseResponseCaching miatt, előtt kell lennie. |
FejlesztőiKivételOldal | Létrehoz egy olyan oldalt, amelyen hibainformációk találhatók, amelyek csak a fejlesztési környezetben való használatra szolgálnak. | A hibákat generáló összetevők előtt. A projektsablonok automatikusan regisztrálják ezt a köztes szoftvert a folyamat első köztes szoftvereként, amikor a környezet fejlesztés. |
Diagnosztikai | Több különálló köztes szoftver, amely fejlesztői kivételoldalt, kivételkezelést, állapotkódlapokat és az új alkalmazások alapértelmezett weblapját biztosítja. | A hibákat generáló összetevők előtt. Terminál a kivételekhez, vagy az új alkalmazások alapértelmezett weblapjának kiszolgálása. |
továbbított fejlécek | Továbbítja a proxizált fejléceket az aktuális kéréshez. | A frissített mezőket felhasználó komponensek előtt. Példák: séma, gazdagép, ügyfél IP-címe, módszer. |
Egészségügyi ellenőrzés | Ellenőrzi egy ASP.NET Core-alkalmazás állapotát és függőségeit, például az adatbázis rendelkezésre állásának ellenőrzését. | Terminál, ha egy kérés megfelel egy állapot-ellenőrzési végpontnak. |
Fejléc terjesztése | Propagálja a HTTP-fejléceket a bejövő kérésből a kimenő HTTP-ügyfélkérelmekbe. | |
HTTP-naplózás | HTTP-kéréseket és válaszokat naplóz. | A middleware folyamatának elején. |
HTTP-metódus felülbírálása | Lehetővé teszi, hogy egy bejövő POST-kérés felülbírálja a metódust. | A frissített metódust használó összetevők előtt. |
HTTPS-átirányítás | Az összes HTTP-kérés átirányítása HTTPS-be. | Az URL-t fogyasztó összetevők előtt. |
HTTP szigorú átviteli biztonsági (HSTS) | Biztonsági fejlesztést biztosító köztes szoftver, amely hozzáad egy speciális válaszfejlécet. | A válaszok elküldése előtt és a kéréseket módosító összetevők után. Példák: Továbbított fejlécek, URL-átírás. |
MVC | MVC/Razor pages használatával dolgozza fel a kérelmeket. | Terminál, ha egy kérés megfelel egy útvonalnak. |
OWIN | Együttműködés OWIN-alapú alkalmazásokkal, kiszolgálókkal és köztes szoftverekkel. | Terminál, ha az OWIN Middleware teljes mértékben feldolgozza a kérést. |
Kimeneti gyorsítótárazás | Támogatja a konfiguráción alapuló gyorsítótárazási válaszokat. | Gyorsítótárazást igénylő összetevők előtt.
UseRouting
UseOutputCaching előtt kell lennie.
UseCORS
UseOutputCaching előtt kell lennie. |
válasz gyorsítótárazása | Támogatást nyújt a gyorsítótárazási válaszokhoz. Ehhez az ügyfél részvétele szükséges. A teljes kiszolgálóvezérléshez használjon kimeneti gyorsítótárazást. | Gyorsítótárazást igénylő összetevők előtt.
UseCORS
UseResponseCaching előtt kell lennie. Általában nem előnyös az olyan felhasználói felületi alkalmazások esetében, mint a Razor Pages, mivel a böngészők általában olyan kérésfejléceket állítanak be, amelyek megakadályozzák a gyorsítótárazást.
Kimeneti gyorsítótárazás előnyös a felhasználói felületű alkalmazásoknak. |
Dekompresszió kérése | Támogatást nyújt a kérések kitömörítéséhez. | A kérelem törzsét olvasó összetevők előtt. |
Választömörítés | Támogatja a válaszok tömörítését. | A tömörítést igénylő összetevők előtt. |
Honosítási kérelem | Honosítási támogatást nyújt. | A honosítás előtt az érzékeny összetevőket. Az útválasztás köztes szoftver után kell megjelennie RouteDataRequestCultureProvider használatakor. |
Végpont-útválasztás | Meghatározza és korlátozza a kérési útvonalakat. | Az útvonalak illesztésére szolgáló terminál. |
GYÓGYFÜRDŐ | A köztes szoftverlánc ezen pontjáról érkező összes kérést az egyoldalas alkalmazás (SPA) alapértelmezett oldalának visszaadásával kezeli. | A lánc későbbi részében, így a statikus fájlok, MVC-műveletek stb. kiszolgálására szolgáló többi köztes szoftver elsőbbséget kap. |
szekció | Támogatást nyújt a felhasználói munkamenetek kezeléséhez. | A munkamenetet igénylő összetevők előtt. |
statikus fájlok |
Támogatja a statikus fájlok és a címtárböngészés kiszolgálását. | Terminál, ha egy kérés egy fájlnak felel meg. |
URL-cím átírása | Támogatja az URL-címek újraírását és a kérések átirányítását. | Az URL-t fogyasztó összetevők előtt. |
W3CLogging | Kiszolgálóelérési naplókat hoz létre a W3C bővített naplófájlformátumú. | A middleware folyamatának elején. |
WebSockets | Engedélyezi a WebSockets protokollt. | A WebSocket-kérelmek elfogadásához szükséges összetevők előtt. |
További erőforrások
- élettartam- és regisztrációs lehetőségek a köztes szoftver teljes mintáját tartalmazza, hatókörrel rendelkező, átmenetiés egyszeri élettartam-szolgáltatásokkal.
- Egyéni ASP.NET Core köztes szoftver írása
- ASP.NET Core köztes szoftver tesztelése
- gRPC-Web konfigurálása az ASP.NET Core-ban
- HTTP-modulok migrálása ASP.NET Core köztes szoftverbe
- alkalmazás indítása a ASP.NET Core
- Kért funkciók az ASP.NET Core-ban
- Factory alapú middleware aktiválás ASP.NET Core-ban
- Köztes szoftver aktiválása harmadik féltől származó tárolóval az ASP.NET Core
A middleware olyan szoftver, amely alkalmazási csővezetékbe van integrálva a kérések és válaszok kezelésére. Minden összetevő:
- Itt adhatja meg, hogy a kérést a folyamat következő összetevőjére kívánja-e továbbítani.
- A folyamat következő összetevője előtt és után is végezhet munkát.
A kérelemdelegáltak a kérelemfolyamat létrehozásához használhatók. A kérelem delegáltjai kezelik az egyes HTTP-kéréseket.
A kérésdelegáltak Run, Map, és Use bővítménymódszerekkel vannak konfigurálva. Az egyéni kérelemdelegáltak megadhatóak soron belül névtelen metódusként (úgynevezett in-line köztes szoftverként), vagy meghatározhatók egy újrafelhasználható osztályban. Ezek az újrahasználható osztályok és a soron belüli névtelen metódusok köztes szoftver, más néven köztes szoftverösszetevők. A kérelemfolyamat minden köztes szoftverösszetevője felelős a folyamat következő összetevőjének meghívásáért vagy a folyamat rövidzárolásáért. Amikor egy köztes szoftver lekapcsol, terminál köztes szoftvernek nevezik, mert megakadályozza a további köztes szoftverek kérésfeldolgozását.
A HTTP-modulok migrálása ASP.NET Core köztes szoftverbe elmagyarázza a ASP.NET Core kérésfolyamatai és a 4.x ASP.NET közötti különbséget, és további köztes szoftvermintákat biztosít.
Middleware kód elemzése
ASP.NET Core számos fordítóplatform-elemzőt tartalmaz, amelyek ellenőrzik az alkalmazás kódját a minőség szempontjából. További információ: Kódelemzés ASP.NET Core-alkalmazásokban
Köztes rétegbeli folyamatsor létrehozása WebApplication
A ASP.NET Core kérelemfolyamat a kérések delegáltjainak sorozatából áll, amelyet egymás után hívunk meg. Az alábbi ábra a koncepciót mutatja be. A végrehajtás szála a fekete nyilakat követi.
Minden meghatalmazott műveleteket hajthat végre a következő meghatalmazott előtt és után. A kivételkezelési meghatalmazottakat a folyamat korai szakaszában kell meghívni, hogy elkaphassák a folyamat későbbi szakaszaiban előforduló kivételeket.
A legegyszerűbb ASP.NET Core-alkalmazás egyetlen kérelemdelegáltat állít be, amely minden kérést kezel. Ez az eset nem tartalmaz tényleges kérelemfolyamatot. Ehelyett a rendszer egyetlen névtelen függvényt hív meg minden HTTP-kérésre válaszul.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Run(async context =>
{
await context.Response.WriteAsync("Hello world!");
});
app.Run();
Több kérelemdelegált összefűzése együtt a Use-val. A next
paraméter a folyamat következő delegáltját jelöli. A folyamat rövidre kapcsolásához nem meghívni a next
paramétert. Általában a next
delegált előtt és után is hajthat végre műveleteket, ahogy az alábbi példa is mutatja:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Use(async (context, next) =>
{
// Do work that can write to the Response.
await next.Invoke();
// Do logging or other work that doesn't write to the Response.
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from 2nd delegate.");
});
app.Run();
Ha egy meghatalmazott nem ad át kérést a következő meghatalmazottnak, megszakítják a kérések folyamatát. A rövidzárolás gyakran kívánatos, mert elkerüli a szükségtelen munkát. Például a statikus fájl közbensőterminálközvetítő lehet, ha feldolgoz egy statikus fájlra vonatkozó kérést, és megszakítja a folyamat többi részét. A folyamathoz hozzáadott köztes szoftver a további feldolgozást megszakító köztes szoftver előtt továbbra is feldolgozza a kódot a next.Invoke
utasítások után. Azonban tekintse meg a következő figyelmeztetést arról, hogy egy már elküldött válaszra próbál írni.
Figyelmeztetés
Ne hívjon next.Invoke
, miután a válasz el lett küldve az ügyfélnek. A HttpResponse módosítása, miután a válasz megkezdődött, kivételt okoz. Például a fejlécek és állapotkódok beállítása kivételt dob. Írás a választörzsbe a next
meghívása után:
- Protokollsértést okozhat. Például, ha több szöveget ír be, mint a megadott
Content-Length
. - A szövegtörzs formátuma megsérülhet. Például egy HTML lábléc írása egy CSS-fájlba.
HasStarted egy hasznos tipp, amely jelzi, hogy a fejlécek elküldve lettek-e, vagy a törzs írása megtörtént-e.
Run meghatalmazottak nem kapnak next
paramétert. Az első Run
delegált mindig végpont és lezárja az adatfolyamot.
Run
egy konvenció. Egyes köztes szoftverösszetevők Run[Middleware]
metódusokat tehetnek elérhetővé, amelyek a folyamat végén futnak:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Use(async (context, next) =>
{
// Do work that can write to the Response.
await next.Invoke();
// Do logging or other work that doesn't write to the Response.
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from 2nd delegate.");
});
app.Run();
Ha szeretné, hogy az angoltól eltérő nyelvekre is lefordítsuk a kódbejegyzéseket, jelezze nekünk a GitHub vitafórumának ebben aszámon szereplő témájában
Az előző példában a Run
képviselő "Hello from 2nd delegate."
ír a válaszba, majd megszakítja a csővezetéket. Ha a Use
delegált után egy másik Run
vagy Run
delegáltat adnak hozzá, azt nem hívják meg.
Részesítse előnyben az app.Use metódus túlterhelését, amely megköveteli a környezet továbbadását a következőre.
A memóriát nem foglaló app.Use kiterjesztési metódus:
- A környezet átadását igényli
next
részére. - Két belső kérésenkénti foglalást takarít meg, amelyek a másik túlterhelésű változat használatakor szükségesek.
További információ: a GitHub-probléma.
Köztes szoftver rendelése
Az alábbi ábra a ASP.NET Core MVC- és Razor Pages-alkalmazások teljes kérelemfeldolgozási folyamatát mutatja be. Láthatja, hogy egy tipikus alkalmazásban hogyan rendezik a meglévő köztes szoftvereket, és hol adnak hozzá egyéni köztes szoftvereket. Teljes körűen szabályozhatja, hogy miként rendezheti át a meglévő köztes szoftvereket, vagy hogyan szúrhat be új, egyéni köztes szoftvereket a forgatókönyvekhez szükséges módon.
Az előző ábrán szereplő végpont köztes szoftver a megfelelő alkalmazástípushoz (MVC vagy Razor Pages) tartozó szűrőfolyamatot hajtja végre.
Az előző ábrán látható Útválasztás köztes szoftver a Statikus fájlokkövetően van bemutatva. Ez az a sorrend, amelyet a projektsablonok implementálnak alkalmazás explicit meghívásával. UseRouting. Ha nem hívja meg app.UseRouting
, a Útválasztás köztes szoftver alapértelmezés szerint a folyamat elején fut. További információért lásd: Útválasztás.
A köztes szoftverösszetevők Program.cs
fájlban való hozzáadásának sorrendje határozza meg a köztes szoftver összetevőinek meghívásának sorrendjét a kérelmekben, valamint a válasz fordított sorrendjét. A sorrend kritikus a biztonság, teljesítmény és funkcionalitás szempontjából.
Az alábbi kiemelt kód Program.cs
a szokásos ajánlott sorrendben adja hozzá a biztonsághoz kapcsolódó köztes szoftverösszetevőket:
using IndividualAccountsExample.Data;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
// 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.UseStaticFiles();
// app.UseCookiePolicy();
app.UseRouting();
// app.UseRequestLocalization();
// app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
// app.UseSession();
// app.UseResponseCompression();
// app.UseResponseCaching();
app.MapRazorPages();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
Az előző kódban:
- Az a köztes szoftver, amely nincs hozzáadva új webalkalmazások egyéni felhasználói fiókjainak létrehozása során, ki van kommentelve.
- Nem minden köztes szoftver jelenik meg pontosan ebben a sorrendben, de sokan igen. Például:
-
UseCors
,UseAuthentication
ésUseAuthorization
a megjelenített sorrendben kell megjelennie. -
UseCors
jelenlegUseResponseCaching
előtt kell megjelennie. Ezt a követelményt GitHub dotnet/aspnetcore #23218című témakör ismerteti. -
UseRequestLocalization
minden olyan köztes szoftver előtt meg kell jelennie, amely ellenőrizheti a kérési kultúrát (példáulapp.UseMvcWithDefaultRoute()
).
-
Bizonyos esetekben a köztes szoftver különböző sorrendben van. A gyorsítótárazás és a tömörítés sorrendje például az adott helyzethez igazodik, és több érvényes sorrend is létezik. Például:
app.UseResponseCaching();
app.UseResponseCompression();
Az előző kóddal a processzorhasználat csökkenthető a tömörített válasz gyorsítótárazásával, de előfordulhat, hogy egy erőforrás több ábrázolását is gyorsítótárazhatja különböző tömörítési algoritmusokkal, például a Gzip vagy a Brotli használatával.
A következő eljárás egyesíti a statikus fájlokat, lehetővé téve a tömörített statikus fájlok gyorsítótárazását.
app.UseResponseCaching();
app.UseResponseCompression();
app.UseStaticFiles();
Az alábbi Program.cs
kód köztes szoftverösszetevőket ad hozzá a gyakori alkalmazásforgatókönyvekhez:
- Kivétel/hibakezelés
- Amikor az alkalmazás a fejlesztési környezetben fut:
- A Fejlesztői Kivételkezelő Köztes Szoftver (UseDeveloperExceptionPage) jelenti az alkalmazás futási idejű hibáit.
- Adatbázis-hibaoldal köztes réteg (UseDatabaseErrorPage) az adatbázis futásidejű hibákat észleli.
- Amikor az alkalmazás éles környezetben fut:
- A Exception Handler Middleware (UseExceptionHandler) a következő köztes szoftverekben szereplő kivételeket rögzíti.
- HTTP Strict Transport Security Protocol (HSTS) Middleware (UseHsts) hozzáadja a
Strict-Transport-Security
fejlécet.
- Amikor az alkalmazás a fejlesztési környezetben fut:
- A HTTPS Redirection Middleware (UseHttpsRedirection) HTTP-kéréseket átirányít a HTTPS-be.
- A Static File Middleware (UseStaticFiles) statikus fájlokat szolgáltat, és megszakítja a kérelmek további feldolgozását.
- Cookie Policy Middleware (UseCookiePolicy) megfelel az alkalmazásnak az EU általános adatvédelmi rendeletének (GDPR) előírásainak.
- Útválasztási köztes szoftver (UseRouting) a kérések átirányításához.
- A hitelesítési köztes szoftver (UseAuthentication) megkísérli hitelesíteni a felhasználót, mielőtt hozzáférnének a biztonságos erőforrásokhoz.
- Az engedélyezési köztes szoftver (UseAuthorization) engedélyezi a felhasználó számára a biztonságos erőforrások elérését.
- A Session Middleware (UseSession) létrehozza és fenntartja a munkamenet állapotát. Ha az alkalmazás munkamenet-állapotot használ, hívja meg a Session Middleware-t a Policy Middleware Cookie és az MVC Middleware előtt.
- Az Endpoint Routing Middleware (UseEndpointsMapRazorPages) segítségével Razor Pages-végpontokat adhat hozzá a kérelemfolyamathoz.
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseSession();
app.MapRazorPages();
Az előző példakódban minden köztesszoftver-bővítménymetódus WebApplicationBuilder a Microsoft.AspNetCore.Builder névtéren keresztül jelenik meg.
UseExceptionHandler a folyamathoz hozzáadott első köztes szoftverösszetevő. Ezért a Exception Handler Middleware a későbbi hívások során előforduló kivételeket észleli.
A statikus fájl köztes réteget a csővezeték korai szakaszában hívjuk meg, hogy a fennmaradó összetevők megkerülésével kezelje a kéréseket és átugorja a folyamat részeit. A Static File Middleware nem biztosít engedélyezési ellenőrzéseket. A Static File Middleware által kiszolgált fájlok, beleértve a wwwrootalatti fájlokat is, nyilvánosan elérhetők. A statikus fájlok védelmének megközelítését a ASP.NET Core
Ha a kérést nem a statikus fájlközvetítő kezeli, a rendszer a hitelesítést végző middleware-nek (UseAuthentication) továbbítja. A hitelesítés nem hagyja figyelmen kívül a hitelesítés nélküli kéréseket. Bár a Hitelesítési köztes szoftver hitelesíti a kérelmeket, az engedélyezés (és az elutasítás) csak azután történik, hogy az MVC kiválaszt egy adott Razor lap- vagy MVC-vezérlőt és műveletet.
Az alábbi példa egy köztesszoftver-sorrendet mutat be, amelyben a statikus fájlokra vonatkozó kérelmeket a statikus fájlközvetítő kezeli a választömörítési köztes szoftver előtt. A statikus fájlok nem lesznek tömörítve ezzel a köztes szoftverrendelettel. A Razor lapokra adott válaszok tömöríthetők.
// Static files aren't compressed by Static File Middleware.
app.UseStaticFiles();
app.UseRouting();
app.UseResponseCompression();
app.MapRazorPages();
Az egyoldalas alkalmazásokról a React és Angular projektsablonok útmutatóiban talál további információt.
UseCors és UseStaticFiles sorrendje
A UseCors
és UseStaticFiles
hívásának sorrendje az alkalmazástól függ. További információ: UseCors és UseStaticFiles sorrend
Továbbított fejlécek köztes szoftver sorrendje
A továbbított fejlécek köztes szoftvernek a többi köztes szoftver előtt kell futnia. Ez a rendezés biztosítja, hogy a továbbított fejlécekre támaszkodó köztes szoftver feldolgozhassa a fejlécértékeket. A továbbított fejlécek köztes szoftver diagnosztikát és hibakezelést követő futtatásához lásd a Továbbított fejlécek köztes szoftver sorrendjerészt.
A köztes szoftverfolyamat elágaztatása
A Map kiterjesztések a csővezeték elágaztatásának konvenciójaként használatosak.
Map
elágaztatja a kérelemfolyamatot az adott kérelemútvonal egyezései alapján. Ha a kérelem elérési útja a megadott elérési úttal kezdődik, a rendszer végrehajtja az ágat.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Map("/map1", HandleMapTest1);
app.Map("/map2", HandleMapTest2);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
app.Run();
static void HandleMapTest1(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map Test 1");
});
}
static void HandleMapTest2(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map Test 2");
});
}
Az alábbi táblázat az előző kód használatával http://localhost:1234
kéréseit és válaszait mutatja be.
Kérés | Válasz |
---|---|
localhost:1234 | Üdvözlet a nem-térkép delegáltjától. |
localhost:1234/map1 | Térképteszt 1 |
localhost:1234/map2 | Térképteszt 2 |
localhost:1234/map3 | Üdvözlet a nem-térkép delegáltjától. |
Ha a(z) Map
-t használnak, eltávolítják a megfeleltetett elérésiút-szegmenseket a HttpRequest.Path
-ből, és hozzáfűzik a HttpRequest.PathBase
-höz minden kérésnél.
Map
például támogatja a beágyazást:
app.Map("/level1", level1App => {
level1App.Map("/level2a", level2AApp => {
// "/level1/level2a" processing
});
level1App.Map("/level2b", level2BApp => {
// "/level1/level2b" processing
});
});
Map
egyszerre több szegmensnek is megfelelhet:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Map("/map1/seg1", HandleMultiSeg);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
app.Run();
static void HandleMultiSeg(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map Test 1");
});
}
MapWhen elágaztatja a kérelemfolyamatot az adott predikátum eredménye alapján. A bármilyen Func<HttpContext, bool>
típusú predikátum felhasználható a kérések folyamat egy új ágára való leképezésére. Az alábbi példában egy predikátumot használunk egy lekérdezési sztringváltozó jelenlétének észlelésére branch
:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapWhen(context => context.Request.Query.ContainsKey("branch"), HandleBranch);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
app.Run();
static void HandleBranch(IApplicationBuilder app)
{
app.Run(async context =>
{
var branchVer = context.Request.Query["branch"];
await context.Response.WriteAsync($"Branch used = {branchVer}");
});
}
Az alábbi táblázat az előző kód használatával http://localhost:1234
kéréseit és válaszait mutatja be:
Kérés | Válasz |
---|---|
localhost:1234 |
Hello from non-Map delegate. |
localhost:1234/?branch=main |
Branch used = main |
UseWhen a kérelemfolyamatot is elágaztatja az adott predikátum eredménye alapján. A MapWhen
-val ellentétben ez az ág újra csatlakozik a fő folyamathoz, ha nem okoz rövidzárlatot, vagy nem tartalmaz terminálközvetítőt.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseWhen(context => context.Request.Query.ContainsKey("branch"),
appBuilder => HandleBranchAndRejoin(appBuilder));
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
app.Run();
void HandleBranchAndRejoin(IApplicationBuilder app)
{
var logger = app.ApplicationServices.GetRequiredService<ILogger<Program>>();
app.Use(async (context, next) =>
{
var branchVer = context.Request.Query["branch"];
logger.LogInformation("Branch used = {branchVer}", branchVer);
// Do work that doesn't write to the Response.
await next();
// Do other work that doesn't write to the Response.
});
}
Az előző példában a Hello from non-Map delegate.
válasza minden kéréshez meg van írva. Ha a kérés tartalmaz egy branch
lekérdezési sztringváltozót, annak értékét a rendszer naplózza a főfolyamat újbóli összekapcsolása előtt.
Beépített köztes szoftver
Az ASP.NET Core a következő middleware komponenseket tartalmazza. A Order oszlop a köztes szoftvernek a kérelemfeldolgozási folyamatban való elhelyezésével kapcsolatos megjegyzéseket tartalmaz, valamint azt, hogy a köztes szoftver milyen feltételek mellett fejezheti be a kérelmek feldolgozását. Amikor egy köztes szoftver rövidzárlatot ad a kérésfeldolgozó folyamatnak, és megakadályozza a további alsóbb rétegbeli köztes szoftvereket a kérések feldolgozásában, terminál köztes szoftvernek nevezzük. További információ a rövidzárolásról a WebApplication köztes szoftveres folyamat létrehozása című részben található.
Köztes szoftver | Leírás | Megrendelés |
---|---|---|
Hitelesítés | Hitelesítési támogatást nyújt. | Mielőtt szükség lenne HttpContext.User -ra. OAuth-visszahívások terminálja. |
Engedélyezés | Engedélyezési támogatást nyújt. | Közvetlenül a hitelesítési köztes szoftver után. |
Cookie szabályzat | Nyomon követi a felhasználók hozzájárulását a személyes adatok tárolásához, és betartatja cookie mezőkre vonatkozó minimális szabványokat, például secure és SameSite . |
A köztes szoftver előtt, amely cookie-kat ad ki. Példák: Hitelesítés, Munkamenet, MVC (TempData). |
CORS | A forrásközi erőforrásmegosztást konfigurálja. | A CORS-t használó összetevők előtt.
UseCors jelenleg UseResponseCaching miatt, előtt kell lennie. |
FejlesztőiKivételOldal | Létrehoz egy olyan oldalt, amelyen hibainformációk találhatók, amelyek csak a fejlesztési környezetben való használatra szolgálnak. | A hibákat generáló összetevők előtt. A projektsablonok automatikusan regisztrálják ezt a köztes szoftvert a folyamat első köztes szoftvereként, amikor a környezet fejlesztés. |
Diagnosztikai | Több különálló köztes szoftver, amely fejlesztői kivételoldalt, kivételkezelést, állapotkódlapokat és az új alkalmazások alapértelmezett weblapját biztosítja. | A hibákat generáló összetevők előtt. Terminál a kivételekhez, vagy az új alkalmazások alapértelmezett weblapjának kiszolgálása. |
továbbított fejlécek | Továbbítja a proxizált fejléceket az aktuális kéréshez. | A frissített mezőket felhasználó komponensek előtt. Példák: séma, gazdagép, ügyfél IP-címe, módszer. |
Egészségügyi ellenőrzés | Ellenőrzi egy ASP.NET Core-alkalmazás állapotát és függőségeit, például az adatbázis rendelkezésre állásának ellenőrzését. | Terminál, ha egy kérés megfelel egy állapot-ellenőrzési végpontnak. |
Fejléc terjesztése | Propagálja a HTTP-fejléceket a bejövő kérésből a kimenő HTTP-ügyfélkérelmekbe. | |
HTTP-naplózás | HTTP-kéréseket és válaszokat naplóz. | A middleware folyamatának elején. |
HTTP-metódus felülbírálása | Lehetővé teszi, hogy egy bejövő POST-kérés felülbírálja a metódust. | A frissített metódust használó összetevők előtt. |
HTTPS-átirányítás | Az összes HTTP-kérés átirányítása HTTPS-be. | Az URL-t fogyasztó összetevők előtt. |
HTTP szigorú átviteli biztonsági (HSTS) | Biztonsági fejlesztést biztosító köztes szoftver, amely hozzáad egy speciális válaszfejlécet. | A válaszok elküldése előtt és a kéréseket módosító összetevők után. Példák: Továbbított fejlécek, URL-átírás. |
MVC | MVC/Razor pages használatával dolgozza fel a kérelmeket. | Terminál, ha egy kérés megfelel egy útvonalnak. |
OWIN | Együttműködés OWIN-alapú alkalmazásokkal, kiszolgálókkal és köztes szoftverekkel. | Terminál, ha az OWIN Middleware teljes mértékben feldolgozza a kérést. |
Dekompresszió kérése | Támogatást nyújt a kérések kitömörítéséhez. | A kérelem törzsét olvasó összetevők előtt. |
válasz gyorsítótárazása | Támogatást nyújt a gyorsítótárazási válaszokhoz. | Gyorsítótárazást igénylő összetevők előtt.
UseCORS
UseResponseCaching előtt kell lennie. |
Választömörítés | Támogatja a válaszok tömörítését. | A tömörítést igénylő összetevők előtt. |
Honosítási kérelem | Honosítási támogatást nyújt. | A honosítás előtt az érzékeny összetevőket. Az útválasztás köztes szoftver után kell megjelennie RouteDataRequestCultureProvider használatakor. |
Végpont-útválasztás | Meghatározza és korlátozza a kérési útvonalakat. | Az útvonalak illesztésére szolgáló terminál. |
GYÓGYFÜRDŐ | A köztes szoftverlánc ezen pontjáról érkező összes kérést az egyoldalas alkalmazás (SPA) alapértelmezett oldalának visszaadásával kezeli. | A lánc későbbi részében, így a statikus fájlok, MVC-műveletek stb. kiszolgálására szolgáló többi köztes szoftver elsőbbséget kap. |
szekció | Támogatást nyújt a felhasználói munkamenetek kezeléséhez. | A munkamenetet igénylő összetevők előtt. |
statikus fájlok |
Támogatja a statikus fájlok és a címtárböngészés kiszolgálását. | Terminál, ha egy kérés egy fájlnak felel meg. |
URL-cím átírása | Támogatja az URL-címek újraírását és a kérések átirányítását. | Az URL-t fogyasztó összetevők előtt. |
W3CLogging | Kiszolgálóelérési naplókat hoz létre a W3C bővített naplófájlformátumú. | A middleware folyamatának elején. |
WebSockets | Engedélyezi a WebSockets protokollt. | A WebSocket-kérelmek elfogadásához szükséges összetevők előtt. |
További erőforrások
- élettartam- és regisztrációs lehetőségek a köztes szoftver teljes mintáját tartalmazza, hatókörrel rendelkező, átmenetiés egyszeri élettartam-szolgáltatásokkal.
- Egyéni ASP.NET Core köztes szoftver írása
- ASP.NET Core köztes szoftver tesztelése
- gRPC-Web konfigurálása az ASP.NET Core-ban
- HTTP-modulok migrálása ASP.NET Core köztes szoftverbe
- alkalmazás indítása a ASP.NET Core
- Kért funkciók az ASP.NET Core-ban
- Factory alapú middleware aktiválás ASP.NET Core-ban
- Köztes szoftver aktiválása harmadik féltől származó tárolóval az ASP.NET Core
A middleware olyan szoftver, amely alkalmazási csővezetékbe van integrálva a kérések és válaszok kezelésére. Minden összetevő:
- Itt adhatja meg, hogy a kérést a folyamat következő összetevőjére kívánja-e továbbítani.
- A folyamat következő összetevője előtt és után is végezhet munkát.
A kérelemdelegáltak a kérelemfolyamat létrehozásához használhatók. A kérelem delegáltjai kezelik az egyes HTTP-kéréseket.
A kérésdelegáltak Run, Map, és Use bővítménymódszerekkel vannak konfigurálva. Az egyéni kérelemdelegáltak megadhatóak soron belül névtelen metódusként (úgynevezett in-line köztes szoftverként), vagy meghatározhatók egy újrafelhasználható osztályban. Ezek az újrahasználható osztályok és a soron belüli névtelen metódusok köztes szoftver, más néven köztes szoftverösszetevők. A kérelemfolyamat minden köztes szoftverösszetevője felelős a folyamat következő összetevőjének meghívásáért vagy a folyamat rövidzárolásáért. Amikor egy köztes szoftver lekapcsol, terminál köztes szoftvernek nevezik, mert megakadályozza a további köztes szoftverek kérésfeldolgozását.
A HTTP-modulok migrálása ASP.NET Core köztes szoftverbe elmagyarázza a ASP.NET Core kérésfolyamatai és a 4.x ASP.NET közötti különbséget, és további köztes szoftvermintákat biztosít.
Köztes szoftverfolyamat létrehozása az IApplicationBuilder használatával
A ASP.NET Core kérelemfolyamat a kérések delegáltjainak sorozatából áll, amelyet egymás után hívunk meg. Az alábbi ábra a koncepciót mutatja be. A végrehajtás szála a fekete nyilakat követi.
Minden meghatalmazott műveleteket hajthat végre a következő meghatalmazott előtt és után. A kivételkezelési meghatalmazottakat a folyamat korai szakaszában kell meghívni, hogy elkaphassák a folyamat későbbi szakaszaiban előforduló kivételeket.
A legegyszerűbb ASP.NET Core-alkalmazás egyetlen kérelemdelegáltat állít be, amely minden kérést kezel. Ez az eset nem tartalmaz tényleges kérelemfolyamatot. Ehelyett a rendszer egyetlen névtelen függvényt hív meg minden HTTP-kérésre válaszul.
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Hello, World!");
});
}
}
Több kérelemdelegált összefűzése együtt a Use-val. A next
paraméter a folyamat következő delegáltját jelöli. Csővezeték rövidre zárásához nem szabad meghívni a következő paramétert. Általában a következő meghatalmazott előtt és után is hajthat végre műveleteket, ahogy az alábbi példa is mutatja:
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.Use(async (context, next) =>
{
// Do work that doesn't write to the Response.
await next.Invoke();
// Do logging or other work that doesn't write to the Response.
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from 2nd delegate.");
});
}
}
Ha egy meghatalmazott nem ad át kérést a következő meghatalmazottnak, megszakítják a kérések folyamatát. A rövidzárolás gyakran kívánatos, mert elkerüli a szükségtelen munkát. Például a statikus fájl közbensőterminálközvetítő lehet, ha feldolgoz egy statikus fájlra vonatkozó kérést, és megszakítja a folyamat többi részét. A folyamathoz hozzáadott köztes szoftver a további feldolgozást megszakító köztes szoftver előtt továbbra is feldolgozza a kódot a next.Invoke
utasítások után. Azonban tekintse meg a következő figyelmeztetést arról, hogy egy már elküldött válaszra próbál írni.
Figyelmeztetés
Ne hívjon next.Invoke
, miután a válasz el lett küldve az ügyfélnek. A HttpResponse módosítása, miután a válasz megkezdődött, kivételt okoz. Például a fejlécek és állapotkódok beállítása kivételt dob. Írás a választörzsbe a next
meghívása után:
- Protokollsértést okozhat. Például, ha több szöveget ír be, mint a megadott
Content-Length
. - A szövegtörzs formátuma megsérülhet. Például egy HTML lábléc írása egy CSS-fájlba.
HasStarted egy hasznos tipp, amely jelzi, hogy a fejlécek elküldve lettek-e, vagy a törzs írása megtörtént-e.
Run meghatalmazottak nem kapnak next
paramétert. Az első Run
delegált mindig végpont és lezárja az adatfolyamot.
Run
egy konvenció. Egyes köztes szoftverösszetevők Run[Middleware]
metódusokat tehetnek elérhetővé, amelyek a folyamat végén futnak:
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.Use(async (context, next) =>
{
// Do work that doesn't write to the Response.
await next.Invoke();
// Do logging or other work that doesn't write to the Response.
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from 2nd delegate.");
});
}
}
Ha szeretné, hogy az angoltól eltérő nyelvekre is lefordítsuk a kódbejegyzéseket, jelezze nekünk a GitHub vitafórumának ebben aszámon szereplő témájában
Az előző példában a Run
képviselő "Hello from 2nd delegate."
ír a válaszba, majd megszakítja a csővezetéket. Ha a Use
delegált után egy másik Run
vagy Run
delegáltat adnak hozzá, azt nem hívják meg.
Köztes szoftver rendelése
Az alábbi ábra a ASP.NET Core MVC- és Razor Pages-alkalmazások teljes kérelemfeldolgozási folyamatát mutatja be. Láthatja, hogy egy tipikus alkalmazásban hogyan rendezik a meglévő köztes szoftvereket, és hol adnak hozzá egyéni köztes szoftvereket. Teljes körűen szabályozhatja, hogy miként rendezheti át a meglévő köztes szoftvereket, vagy hogyan szúrhat be új, egyéni köztes szoftvereket a forgatókönyvekhez szükséges módon.
Az előző ábrán szereplő végpont köztes szoftver a megfelelő alkalmazástípushoz (MVC vagy Razor Pages) tartozó szűrőfolyamatot hajtja végre.
A köztes szoftverösszetevők Startup.Configure
metódusban való hozzáadásának sorrendje határozza meg a köztes szoftver összetevőinek meghívási sorrendjét a kérelmekben, valamint a válasz fordított sorrendjét. A sorrend kritikus a biztonság, teljesítmény és funkcionalitás szempontjából.
Az alábbi Startup.Configure
metódus a szokásos ajánlott sorrendben adja hozzá a biztonsághoz kapcsolódó köztes szoftverösszetevőket:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
// app.UseCookiePolicy();
app.UseRouting();
// app.UseRequestLocalization();
// app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
// app.UseSession();
// app.UseResponseCompression();
// app.UseResponseCaching();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
Az előző kódban:
- Az a köztes szoftver, amely nincs hozzáadva új webalkalmazások egyéni felhasználói fiókjainak létrehozása során, ki van kommentelve.
- Nem minden köztes szoftver jelenik meg pontosan ebben a sorrendben, de sokan igen. Például:
-
UseCors
,UseAuthentication
ésUseAuthorization
a megjelenített sorrendben kell megjelennie. jelenleg előtt kell megjelenniemiatt ez a hiba . -
UseRequestLocalization
minden olyan köztes szoftver előtt meg kell jelennie, amely ellenőrizheti a kérési kultúrát (példáulapp.UseMvcWithDefaultRoute()
).
-
Bizonyos esetekben a köztes szoftver különböző sorrendben van. A gyorsítótárazás és a tömörítés sorrendje például specifikus az adott esetre, és több érvényes sorrend is létezik. Például:
app.UseResponseCaching();
app.UseResponseCompression();
Az előző kóddal a CPU-t mentheti a tömörített válasz gyorsítótárazásával, de előfordulhat, hogy egy erőforrás több különféle ábrázolását gyorsítótárazza különböző tömörítési algoritmusokkal, például a Gzip vagy a Brotli.
A következő eljárás egyesíti a statikus fájlokat, lehetővé téve a tömörített statikus fájlok gyorsítótárazását.
app.UseResponseCaching();
app.UseResponseCompression();
app.UseStaticFiles();
A következő Startup.Configure
metódus köztes szoftverösszetevőket ad hozzá a gyakori alkalmazásforgatókönyvekhez:
- Kivétel/hibakezelés
- Amikor az alkalmazás a fejlesztési környezetben fut:
- A Fejlesztői Kivételkezelő Köztes Szoftver (UseDeveloperExceptionPage) jelenti az alkalmazás futási idejű hibáit.
- Adatbázishiba-oldal – egy közbenső réteg, amely az adatbázis futásidejű hibáit jelenti.
- Amikor az alkalmazás éles környezetben fut:
- A Exception Handler Middleware (UseExceptionHandler) a következő köztes szoftverekben szereplő kivételeket rögzíti.
- HTTP Strict Transport Security Protocol (HSTS) Middleware (UseHsts) hozzáadja a
Strict-Transport-Security
fejlécet.
- Amikor az alkalmazás a fejlesztési környezetben fut:
- A HTTPS Redirection Middleware (UseHttpsRedirection) HTTP-kéréseket átirányít a HTTPS-be.
- A Static File Middleware (UseStaticFiles) statikus fájlokat szolgáltat, és megszakítja a kérelmek további feldolgozását.
- Cookie Policy Middleware (UseCookiePolicy) megfelel az alkalmazásnak az EU általános adatvédelmi rendeletének (GDPR) előírásainak.
- Útválasztási köztes szoftver (UseRouting) a kérések átirányításához.
- A hitelesítési köztes szoftver (UseAuthentication) megkísérli hitelesíteni a felhasználót, mielőtt hozzáférnének a biztonságos erőforrásokhoz.
- Az engedélyezési köztes szoftver (UseAuthorization) engedélyezi a felhasználó számára a biztonságos erőforrások elérését.
- A Session Middleware (UseSession) létrehozza és fenntartja a munkamenet állapotát. Ha az alkalmazás munkamenet-állapotot használ, hívja meg a Session Middleware-t a Policy Middleware Cookie és az MVC Middleware előtt.
- Az Endpoint Routing Middleware (UseEndpointsMapRazorPages) segítségével Razor Pages-végpontokat adhat hozzá a kérelemfolyamathoz.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseSession();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
Az előző példakódban minden köztesszoftver-bővítménymetódus IApplicationBuilder a Microsoft.AspNetCore.Builder névtéren keresztül jelenik meg.
UseExceptionHandler a folyamathoz hozzáadott első köztes szoftverösszetevő. Ezért a Exception Handler Middleware a későbbi hívások során előforduló kivételeket észleli.
A statikus fájl köztes réteget a csővezeték korai szakaszában hívjuk meg, hogy a fennmaradó összetevők megkerülésével kezelje a kéréseket és átugorja a folyamat részeit. A Static File Middleware nem biztosít engedélyezési ellenőrzéseket. A Static File Middleware által kiszolgált fájlok, beleértve a wwwrootalatti fájlokat is, nyilvánosan elérhetők. A statikus fájlok védelmének megközelítését a ASP.NET Core
Ha a kérést nem a statikus fájlközvetítő kezeli, a rendszer a hitelesítést végző middleware-nek (UseAuthentication) továbbítja. A hitelesítés nem hagyja figyelmen kívül a hitelesítés nélküli kéréseket. Bár a Hitelesítési köztes szoftver hitelesíti a kérelmeket, az engedélyezés (és az elutasítás) csak azután történik, hogy az MVC kiválaszt egy adott Razor lap- vagy MVC-vezérlőt és műveletet.
Az alábbi példa egy köztesszoftver-sorrendet mutat be, amelyben a statikus fájlokra vonatkozó kérelmeket a statikus fájlközvetítő kezeli a választömörítési köztes szoftver előtt. A statikus fájlok nem lesznek tömörítve ezzel a köztes szoftverrendelettel. A Razor lapokra adott válaszok tömöríthetők.
public void Configure(IApplicationBuilder app)
{
// Static files aren't compressed by Static File Middleware.
app.UseStaticFiles();
app.UseRouting();
app.UseResponseCompression();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
Az egyoldalas alkalmazások (SPA-k) esetében az SPA köztes szoftver UseSpaStaticFiles általában utoljára található a köztes szoftverfolyamatban. A SPA köztes szoftver az utolsó:
- Annak érdekében, hogy az összes többi köztes szoftver először válaszolhasson az egyező kérésekre.
- Annak engedélyezése, hogy az ügyféloldali útválasztással rendelkező SPA-k futtassanak olyan útvonalakat, amelyeket a kiszolgálóalkalmazás nem ismer fel.
Az SLA-kkal kapcsolatos további részletekért tekintse meg a React és Angular projektsablonok útmutatóit.
Továbbított fejlécek köztes szoftver sorrendje
A továbbított fejlécek köztes szoftvernek a többi köztes szoftver előtt kell futnia. Ez a rendezés biztosítja, hogy a továbbított fejlécekre támaszkodó köztes szoftver feldolgozhassa a fejlécértékeket. A továbbított fejlécek köztes szoftver diagnosztikát és hibakezelést követő futtatásához lásd a Továbbított fejlécek köztes szoftver sorrendjerészt.
A köztes szoftverfolyamat elágaztatása
A Map kiterjesztések a csővezeték elágaztatásának konvenciójaként használatosak.
Map
elágaztatja a kérelemfolyamatot az adott kérelemútvonal egyezései alapján. Ha a kérelem elérési útja a megadott elérési úttal kezdődik, a rendszer végrehajtja az ágat.
public class Startup
{
private static void HandleMapTest1(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map Test 1");
});
}
private static void HandleMapTest2(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map Test 2");
});
}
public void Configure(IApplicationBuilder app)
{
app.Map("/map1", HandleMapTest1);
app.Map("/map2", HandleMapTest2);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
}
}
Az alábbi táblázat az előző kód használatával http://localhost:1234
kéréseit és válaszait mutatja be.
Kérés | Válasz |
---|---|
localhost:1234 | Üdvözlet a nem-térkép delegáltjától. |
localhost:1234/map1 | Térképteszt 1 |
localhost:1234/map2 | Térképteszt 2 |
localhost:1234/map3 | Üdvözlet a nem-térkép delegáltjától. |
Ha a(z) Map
-t használnak, eltávolítják a megfeleltetett elérésiút-szegmenseket a HttpRequest.Path
-ből, és hozzáfűzik a HttpRequest.PathBase
-höz minden kérésnél.
Map
például támogatja a beágyazást:
app.Map("/level1", level1App => {
level1App.Map("/level2a", level2AApp => {
// "/level1/level2a" processing
});
level1App.Map("/level2b", level2BApp => {
// "/level1/level2b" processing
});
});
Map
egyszerre több szegmensnek is megfelelhet:
public class Startup
{
private static void HandleMultiSeg(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map multiple segments.");
});
}
public void Configure(IApplicationBuilder app)
{
app.Map("/map1/seg1", HandleMultiSeg);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
}
}
MapWhen elágaztatja a kérelemfolyamatot az adott predikátum eredménye alapján. A bármilyen Func<HttpContext, bool>
típusú predikátum felhasználható a kérések folyamat egy új ágára való leképezésére. Az alábbi példában egy predikátumot használunk egy lekérdezési sztringváltozó jelenlétének észlelésére branch
:
public class Startup
{
private static void HandleBranch(IApplicationBuilder app)
{
app.Run(async context =>
{
var branchVer = context.Request.Query["branch"];
await context.Response.WriteAsync($"Branch used = {branchVer}");
});
}
public void Configure(IApplicationBuilder app)
{
app.MapWhen(context => context.Request.Query.ContainsKey("branch"),
HandleBranch);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
}
}
Az alábbi táblázat az előző kód használatával http://localhost:1234
kéréseit és válaszait mutatja be:
Kérés | Válasz |
---|---|
localhost:1234 | Üdvözlet a nem-térkép delegáltjától. |
localhost:1234/?branch=main | Használt ág = fő |
UseWhen a kérelemfolyamatot is elágaztatja az adott predikátum eredménye alapján. A MapWhen
-val ellentétben ez az ág újra csatlakozik a fő folyamathoz, ha nem okoz rövidzárlatot, vagy nem tartalmaz terminálközvetítőt.
public class Startup
{
private void HandleBranchAndRejoin(IApplicationBuilder app, ILogger<Startup> logger)
{
app.Use(async (context, next) =>
{
var branchVer = context.Request.Query["branch"];
logger.LogInformation("Branch used = {branchVer}", branchVer);
// Do work that doesn't write to the Response.
await next();
// Do other work that doesn't write to the Response.
});
}
public void Configure(IApplicationBuilder app, ILogger<Startup> logger)
{
app.UseWhen(context => context.Request.Query.ContainsKey("branch"),
appBuilder => HandleBranchAndRejoin(appBuilder, logger));
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from main pipeline.");
});
}
}
Az előző példában a "Hello from main pipeline." válasz van megírva minden kéréshez. Ha a kérés tartalmaz egy branch
lekérdezési sztringváltozót, annak értékét a rendszer naplózza a főfolyamat újbóli összekapcsolása előtt.
Beépített köztes szoftver
Az ASP.NET Core a következő middleware komponenseket tartalmazza. A Order oszlop a köztes szoftvernek a kérelemfeldolgozási folyamatban való elhelyezésével kapcsolatos megjegyzéseket tartalmaz, valamint azt, hogy a köztes szoftver milyen feltételek mellett fejezheti be a kérelmek feldolgozását. Amikor egy köztes szoftver rövidzárlatot ad a kérésfeldolgozó folyamatnak, és megakadályozza a további alsóbb rétegbeli köztes szoftvereket a kérések feldolgozásában, terminál köztes szoftvernek nevezzük. Rövidzárlatról további információt a Köztes szoftveres folyamat létrehozása az IApplicationBuilder segítségével részben talál.
Köztes szoftver | Leírás | Megrendelés |
---|---|---|
Hamisítás elleni védelem | Kérés-hamisítás elleni támogatást nyújt. | Hitelesítés és engedélyezés után, végpontok előtt. |
Hitelesítés | Hitelesítési támogatást nyújt. | Mielőtt szükség lenne HttpContext.User -ra. OAuth-visszahívások terminálja. |
Engedélyezés | Engedélyezési támogatást nyújt. | Közvetlenül a hitelesítési köztes szoftver után. |
Cookie szabályzat | Nyomon követi a felhasználók hozzájárulását a személyes adatok tárolásához, és betartatja cookie mezőkre vonatkozó minimális szabványokat, például secure és SameSite . |
A köztes szoftver előtt, amely cookie-kat ad ki. Példák: Hitelesítés, Munkamenet, MVC (TempData). |
CORS | A forrásközi erőforrásmegosztást konfigurálja. | A CORS-t használó összetevők előtt.
UseCors jelenleg UseResponseCaching miatt, előtt kell lennie. |
Diagnosztikai | Több különálló köztes szoftver, amely fejlesztői kivételoldalt, kivételkezelést, állapotkódlapokat és az új alkalmazások alapértelmezett weblapját biztosítja. | A hibákat generáló összetevők előtt. Terminál a kivételekhez, vagy az új alkalmazások alapértelmezett weblapjának kiszolgálása. |
továbbított fejlécek | Továbbítja a proxizált fejléceket az aktuális kéréshez. | A frissített mezőket felhasználó komponensek előtt. Példák: séma, gazdagép, ügyfél IP-címe, módszer. |
Egészségügyi ellenőrzés | Ellenőrzi egy ASP.NET Core-alkalmazás állapotát és függőségeit, például az adatbázis rendelkezésre állásának ellenőrzését. | Terminál, ha egy kérés megfelel egy állapot-ellenőrzési végpontnak. |
Fejléc terjesztése | Propagálja a HTTP-fejléceket a bejövő kérésből a kimenő HTTP-ügyfélkérelmekbe. | |
HTTP-metódus felülbírálása | Lehetővé teszi, hogy egy bejövő POST-kérés felülbírálja a metódust. | A frissített metódust használó összetevők előtt. |
HTTPS-átirányítás | Az összes HTTP-kérés átirányítása HTTPS-be. | Az URL-t fogyasztó összetevők előtt. |
HTTP szigorú átviteli biztonsági (HSTS) | Biztonsági fejlesztést biztosító köztes szoftver, amely hozzáad egy speciális válaszfejlécet. | A válaszok elküldése előtt és a kéréseket módosító összetevők után. Példák: Továbbított fejlécek, URL-átírás. |
MVC | MVC/Razor pages használatával dolgozza fel a kérelmeket. | Terminál, ha egy kérés megfelel egy útvonalnak. |
OWIN | Együttműködés OWIN-alapú alkalmazásokkal, kiszolgálókkal és köztes szoftverekkel. | Terminál, ha az OWIN Middleware teljes mértékben feldolgozza a kérést. |
válasz gyorsítótárazása | Támogatást nyújt a gyorsítótárazási válaszokhoz. | Gyorsítótárazást igénylő összetevők előtt.
UseCORS
UseResponseCaching előtt kell lennie. |
Választömörítés | Támogatja a válaszok tömörítését. | A tömörítést igénylő összetevők előtt. |
Honosítási kérelem | Honosítási támogatást nyújt. | A honosítás előtt az érzékeny összetevőket. Az útválasztás köztes szoftver után kell megjelennie RouteDataRequestCultureProvider használatakor. |
Végpont-útválasztás | Meghatározza és korlátozza a kérési útvonalakat. | Az útvonalak illesztésére szolgáló terminál. |
GYÓGYFÜRDŐ | A köztes szoftverlánc ezen pontjáról érkező összes kérést az egyoldalas alkalmazás (SPA) alapértelmezett oldalának visszaadásával kezeli. | A lánc későbbi részében, így a statikus fájlok, MVC-műveletek stb. kiszolgálására szolgáló többi köztes szoftver elsőbbséget kap. |
szekció | Támogatást nyújt a felhasználói munkamenetek kezeléséhez. | A munkamenetet igénylő összetevők előtt. |
statikus fájlok |
Támogatja a statikus fájlok és a címtárböngészés kiszolgálását. | Terminál, ha egy kérés egy fájlnak felel meg. |
URL-cím átírása | Támogatja az URL-címek újraírását és a kérések átirányítását. | Az URL-t fogyasztó összetevők előtt. |
WebSockets | Engedélyezi a WebSocket protokollt. | A WebSocket-kérelmek elfogadásához szükséges összetevők előtt. |
További erőforrások
- élettartam- és regisztrációs lehetőségek a köztes szoftver teljes mintáját tartalmazza, hatókörrel rendelkező, átmenetiés egyszeri élettartam-szolgáltatásokkal.
- Egyéni ASP.NET Core köztes szoftver írása
- ASP.NET Core köztes szoftver tesztelése
- HTTP-modulok migrálása ASP.NET Core köztes szoftverbe
- alkalmazás indítása a ASP.NET Core
- Kért funkciók az ASP.NET Core-ban
- Factory alapú middleware aktiválás ASP.NET Core-ban
- Köztes szoftver aktiválása harmadik féltől származó tárolóval az ASP.NET Core