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.
Mintakód megtekintése vagy letöltése (hogyan töltsük le)
A válasz gyorsítótárazása csökkenti az ügyfél vagy proxy által a webkiszolgálóra irányuló kérések számát. A válasz gyorsítótárazása csökkenti a webkiszolgáló által a válasz létrehozásához végzett munka mennyiségét is. A válasz gyorsítótárazása fejlécekben van beállítva.
A ResponseCache attribútum beállítja a válasz gyorsítótárazási fejléceit. Az ügyfeleknek és a köztes proxyknak tiszteletben kell tartaniuk a válaszok gyorsítótárazási fejléceit az RFC 9111: HTTP gyorsítótárazásirányelvei szerint.
A HTTP 1.1 gyorsítótárazási specifikációt követő kiszolgálóoldali gyorsítótárazáshoz használja Response Caching Middleware. A middleware a ResponseCacheAttribute tulajdonságaival befolyásolhatja a kiszolgáló-oldali gyorsítótárazási viselkedést.
A válasz gyorsítótárazási köztes szoftvere:
- Engedélyezi a kiszolgálói válaszok gyorsítótárazását HTTP-gyorsítótár fejlécei alapján. Implementálja a szabványos HTTP-gyorsítótárazási szemantikát. A proxykhoz hasonlóan a HTTP-gyorsítótár fejlécein alapuló gyorsítótárak.
- Á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. A .NET 7-es vagy újabb verzióiban elérhető kimeneti gyorsítótárazás a felhasználói felületi alkalmazások előnyeit biztosítja. A kimeneti gyorsítótárazással a konfiguráció dönti el, hogy mit kell gyorsítótárazni a HTTP-fejléctől függetlenül.
- Hasznos lehet olyan ügyfelek nyilvános GET- vagy HEAD API-kéréseihez, amelyeknél teljesülnek a gyorsítótárazási feltételei.
A válasz gyorsítótárazásának teszteléséhez használja a Fiddlereszközt, vagy egy másik eszközt, amely explicit módon be tudja állítani a kérésfejléceket. A fejlécek egyértelmű beállítása a gyorsítótárazás teszteléséhez ajánlott. További információért lásd: Hibaelhárítás.
HTTP-alapú válasz gyorsítótárazása
RFC 9111: HTTP-gyorsítótárazás leírja, hogyan kell az internetes gyorsítótáraknak viselkedniük. A gyorsítótárazáshoz használt elsődleges HTTP-fejléc a gyorsítótár-vezérlési
A gyakori Cache-Control irányelvek az alábbi táblázatban láthatók.
| Directive | Action |
|---|---|
| public | A gyorsítótár tárolhatja a választ. |
| private | A választ nem szabad megosztott gyorsítótárban tárolni. A privát gyorsítótár tárolhatja és újra felhasználhatja a választ. |
| max-age | Az ügyfél nem fogad el olyan választ, amelynek életkora meghaladja a megadott számú másodpercet. Példák: max-age=60 (60 másodperc), max-age=2592000 (1 hónap) |
| no-cache |
Kérések esetén: A gyorsítótár nem használhat tárolt választ a kérés teljesítéséhez. A forráskiszolgáló újragenerálja az ügyfél válaszát, és a köztes szoftver frissíti a tárolt választ a gyorsítótárában. Válaszokon: A válasz nem használható további kérésekhez a forráskiszolgálón történő ellenőrzés nélkül. |
| no-store |
Kérések esetén: A gyorsítótár nem tárolhatja a kérést. Válaszokon: A gyorsítótár nem tárolhatja a válasz egyik részét sem. |
A gyorsítótárazásban szerepet játszó egyéb gyorsítótárfejlécek az alábbi táblázatban láthatók.
| Header | Function |
|---|---|
| Age | A válasz létrejötte vagy sikeres érvényesítése óta eltelt idő becslése másodpercben a forráskiszolgálón. |
| Expires | Az az idő, amely után a válasz elavultnak minősül. |
| Pragma | A HTTP/1.0 gyorsítótárakkal való visszamenőleges kompatibilitás érdekében létezik a no-cache viselkedés beállításához. Ha a Cache-Control fejléc jelen van, a Pragma fejléc figyelmen kívül lesz hagyva. |
| Vary | Azt határozza meg, hogy a gyorsítótárazott válasz nem küldhető el, ha nem egyeznek az összes Vary fejlécmező mind a gyorsítótárazott válasz eredeti kérésében, mind az új kérésben. |
A HTTP-alapú gyorsítótárazás tiszteletben tartja az Cache-Control irányelveket
RFC 9111: HTTP-gyorsítótárazáshoz (5.2. Cache-Control. szakasz) gyorsítótárra van szükség ahhoz, hogy az ügyfél által küldött érvényes Cache-Control fejlécet tiszteletben tarthassa. Az ügyfél no-cache fejlécértékkel kérheti a kéréseket, és kényszerítheti a kiszolgálót, hogy minden kérésre új választ hozzon létre.
Ha figyelembe veszi a HTTP-gyorsítótárazás célját, érdemes mindig tiszteletben tartani az ügyfél Cache-Control kérésfejléceket. A hivatalos specifikáció szerint a gyorsítótárazás célja, hogy csökkentse az ügyfelek, proxyk és kiszolgálók hálózatán keresztüli kérelmek teljesítésének késését és hálózati terhelését. Ez nem feltétlenül a forráskiszolgáló terhelésének szabályozására szolgál.
A Response Caching Middleware használatakor nincs fejlesztői vezérlés a gyorsítótárazási viselkedés felett, mert a köztes szoftver megfelel a hivatalos gyorsítótárazási specifikációnak. A .NET 7-ben kimeneti gyorsítótárazási támogatása a kiszolgáló terhelésének jobb szabályozásához lett hozzáadva. További információkért lásd: Kimeneti gyorsítótárazás.
ResponseCache attribútum
A ResponseCacheAttribute megadja azokat a paramétereket, amelyek szükségesek a válasz gyorsítótárazásának megfelelő fejlécek beállításához.
Warning
Tiltsa le a hitelesített ügyfelek adatait tartalmazó tartalom gyorsítótárazását. Csak akkor szabad engedélyezni a gyorsítótárazást, ha a tartalom nem változik a felhasználó identitása vagy az alapján, hogy a felhasználó be van-e jelentkezve.
VaryByQueryKeys a tárolt választ a lekérdezési kulcsok megadott listájának értékei alapján határozza meg. Ha egyetlen * értéket ad meg, a köztes szoftver az összes lekérdezési sztringparaméter válaszait eltérően határozza meg.
Response Caching Middleware beállításához engedélyezni kell a VaryByQueryKeys tulajdonság beállítását. Ellenkező esetben a rendszer futásidejű kivételt ad ki. A VaryByQueryKeys tulajdonsághoz nincs megfelelő HTTP-fejléc. A tulajdonság egy HTTP-szolgáltatás, amelyet a Response Caching Middleware kezel. Ahhoz, hogy a köztes réteg gyorsítótárazott választ szolgáljon ki, a lekérdezési karaktersorozatnak és annak értékének meg kell egyeznie egy korábbi kéréssel. Vegyük például a következő táblázatban látható kérések és eredmények sorrendjét:
| Request | Visszaküldve: |
|---|---|
http://example.com?key1=value1 |
Server |
http://example.com?key1=value1 |
Middleware |
http://example.com?key1=NewValue |
Server |
Az első kérést a kiszolgáló adja vissza, és a köztes szoftverben gyorsítótárazza. A második kérést a köztes szoftver adja vissza, mert a lekérdezési sztring megegyezik az előző kéréssel. A harmadik kérés nincs a köztes szoftver gyorsítótárában, mert a lekérdezési sztring értéke nem egyezik meg egy korábbi kéréssel.
A ResponseCacheAttribute egy IFilterFactorykonfigurálására és létrehozására szolgál (Microsoft.AspNetCore.Mvc.Internal.ResponseCacheFilterkeresztül). A ResponseCacheFilter elvégzi a megfelelő HTTP-fejlécek és a válasz funkcióinak frissítését. A szűrő:
- Eltávolítja a
Vary,Cache-ControlésPragmameglévő fejléceit. - A megfelelő fejléceket a ResponseCacheAttributemegadott tulajdonságok szerint írja ki.
- Frissíti a válasz gyorsítótárazási HTTP-funkcióját, ha VaryByQueryKeys be van állítva.
Vary
Ez a fejléc csak akkor lesz megírva, ha a VaryByHeader tulajdonság be van állítva. A tulajdonság a Vary tulajdonság értékére van állítva. Az alábbi minta a VaryByHeader tulajdonságot használja:
[ApiController]
public class TimeController : ControllerBase
{
[Route("api/[controller]")]
[HttpGet]
[ResponseCache(VaryByHeader = "User-Agent", Duration = 30)]
public ContentResult GetTime() => Content(
DateTime.Now.Millisecond.ToString());
A válaszfejlécek megtekintése a Fiddlerrel vagy egy másik eszközzel. A válaszfejlécek a következők:
Cache-Control: public,max-age=30
Vary: User-Agent
Az előző kódhoz hozzá kell adni a Response Caching Middleware-szolgáltatásokat AddResponseCaching a szolgáltatásgyűjteményhez, és konfigurálnia kell az alkalmazást a köztes szoftver használatára a UseResponseCaching bővítménymetódussal.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddResponseCaching();
var app = builder.Build();
app.UseHttpsRedirection();
// UseCors must be called before UseResponseCaching
//app.UseCors();
app.UseResponseCaching();
app.UseAuthorization();
app.MapControllers();
app.Run();
NoStore és Location.None
NoStore felülbírálja a többi tulajdonság többségét. Ha ez a tulajdonság trueértékre van állítva, a Cache-Control fejléc beállítása no-storelesz. Ha Location be van állítva None:
-
Cache-Controlno-store,no-cacheértékre van állítva. -
Pragmano-cacheértékre van állítva.
Ha NoStorefalse van, és LocationNonevan, akkor Cache-Controlés Pragmano-cache.
A NoStore általában true-re van beállítva a hibaoldalak esetén. Az alábbiakban válaszfejléceket hozunk létre, amelyek arra utasítják az ügyfelet, hogy ne tárolja a választ.
[Route("api/[controller]/ticks")]
[HttpGet]
[ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)]
public ContentResult GetTimeTicks() => Content(
DateTime.Now.Ticks.ToString());
Az előző kód a következő fejléceket tartalmazza a válaszban:
Cache-Control: no-store,no-cache
Pragma: no-cache
Ha a ResponseCacheAttribute az alkalmazás MVC-vezérlőinek vagy Razor Lapok lapválaszainak mindegyikére alkalmazni szeretné, vegye fel egy MVC szűrővel vagy Razor Lapok szűrővel.
MVC-alkalmazásban:
builder.Services.AddControllersWithViews().AddMvcOptions(options =>
options.Filters.Add(
new ResponseCacheAttribute
{
NoStore = true,
Location = ResponseCacheLocation.None
}));
Az Razor Pages alkalmazásokra vonatkozó megközelítést lásd: A ResponseCacheAttribute hozzáadása az MVC globális szűrőlistájához nem vonatkozik a Razor Pages oldalakra (dotnet/aspnetcore #18890). A probléma megjegyzésében szereplő példa a ASP.NET Core-t célzó alkalmazásokhoz készült a Minimal API-k 6.0-s kiadása előtt. 6.0-s vagy újabb alkalmazások esetén módosítsa a példában szereplő szolgáltatásregisztrációt builder.Services.AddSingleton...Program.cs.
Hely és időtartam
A gyorsítótárazás engedélyezéséhez a Duration pozitív értékre kell állítani, Location pedig Any (alapértelmezett) vagy Clientkell lennie. A keretrendszer a Cache-Control fejlécet először a helyértékre, majd a válasz max-age értékére állítja.
Locationesetén a Any és Client opciók a Cache-Control fejlécértékeket public és private-re alakítják át, sorrendben. Ahogy a NoStore és a Location.None szakaszban is szerepel, a Location beállítása NoneCache-Control és Pragma fejléceket is no-cacheértékre állítja.
Location.Any (Cache-Controlpublic) azt jelzi, hogy a ügyfél vagy bármely köztes proxy gyorsítótárazhatja az értéket, beleértve a válasz gyorsítótárazási köztes szoftvert.
A gyorsítótár-vezérlőfejlécek útmutatást nyújtanak az ügyfelek és a közvetítő proxyk számára a válaszok gyorsítótárazásához. Nincs garancia arra, hogy az ügyfelek és proxyk tiszteletben tartják RFC 9111: HTTP gyorsítótárazási. Response Caching Middleware mindig betartja a specifikációban meghatározott szabályait a gyorsítótárazásnak.
Az alábbi példa a Duration beállításával és az alapértelmezett Location érték elhagyásával létrehozott fejléceket mutatja be:
[Route("api/[controller]/ms")]
[HttpGet]
[ResponseCache(Duration = 10, Location = ResponseCacheLocation.Any, NoStore = false)]
public ContentResult GetTimeMS() => Content(
DateTime.Now.Millisecond.ToString());
Az előző kód a következő fejléceket tartalmazza a válaszban:
Cache-Control: public,max-age=10
Gyorsítótár-profilok
A válaszgyorsítótár-beállítások számos vezérlőművelet-attribútum duplikálása helyett a gyorsítótárprofilok beállítási lehetőségként is konfigurálhatók az MVC/Razor Pages beállításakor. A hivatkozott gyorsítótárprofilban található értékeket használja alapértelmezettként a ResponseCacheAttribute, amelyeket az attribútumban megadott bármely tulajdonság felülír.
Az alábbi példa egy 30 másodperces gyorsítótárprofilt mutat be:
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddResponseCaching();
builder.Services.AddControllers(options =>
{
options.CacheProfiles.Add("Default30",
new CacheProfile()
{
Duration = 30
});
});
var app = builder.Build();
app.UseHttpsRedirection();
// UseCors must be called before UseResponseCaching
//app.UseCors();
app.UseResponseCaching();
app.UseAuthorization();
app.MapControllers();
app.Run();
A következő kód a Default30 gyorsítótárprofilra hivatkozik:
[ApiController]
[ResponseCache(CacheProfileName = "Default30")]
public class Time2Controller : ControllerBase
{
[Route("api/[controller]")]
[HttpGet]
public ContentResult GetTime() => Content(
DateTime.Now.Millisecond.ToString());
[Route("api/[controller]/ticks")]
[HttpGet]
public ContentResult GetTimeTicks() => Content(
DateTime.Now.Ticks.ToString());
}
A Default30 gyorsítótárprofil által kapott fejlécválasz a következőket tartalmazza:
Cache-Control: public,max-age=30
A [ResponseCache] attribútum a következőre alkalmazható:
- Razor Lapok: Az attribútumok nem alkalmazhatók a kezelői metódusokra. A felhasználói felületi alkalmazásokkal használt böngészők megakadályozzák a válasz gyorsítótárazását.
- MVC-vezérlők.
- MVC műveleti módszerek: A metódusszintű attribútumok felülbírálják az osztályszintű attribútumokban megadott beállításokat.
A következő kód a [ResponseCache] attribútumot alkalmazza a vezérlő szintjén és a metódus szintjén:
[ApiController]
[ResponseCache(VaryByHeader = "User-Agent", Duration = 30)]
public class Time4Controller : ControllerBase
{
[Route("api/[controller]")]
[HttpGet]
public ContentResult GetTime() => Content(
DateTime.Now.Millisecond.ToString());
[Route("api/[controller]/ticks")]
[HttpGet]
public ContentResult GetTimeTicks() => Content(
DateTime.Now.Ticks.ToString());
[Route("api/[controller]/ms")]
[HttpGet]
[ResponseCache(Duration = 10, Location = ResponseCacheLocation.Any, NoStore = false)]
public ContentResult GetTimeMS() => Content(
DateTime.Now.Millisecond.ToString());
}
További erőforrások
- Válaszok tárolása gyorsítótárakban
- Cache-Control
- Memóriabeli gyorsítótárazás ASP.NET Core
- Elosztott gyorsítótárazás ASP.NET Core
- Változások észlelése változási tokenekkel az ASP.NET Core
- Response Caching Middleware az ASP.NET Core
- Cache Tag Helper az ASP.NET Core MVC
- Elosztott gyorsítótár címke segédprogram az ASP.NET Core-ban
Mintakód megtekintése vagy letöltése (hogyan töltsük le)
A válasz gyorsítótárazása csökkenti az ügyfél vagy proxy által a webkiszolgálóra irányuló kérések számát. A válasz gyorsítótárazása csökkenti a webkiszolgáló által a válasz létrehozásához végzett munka mennyiségét is. A válasz gyorsítótárazását fejlécek vezérlik, amelyek meghatározzák, hogy az ügyfél, a proxy és a köztes szoftver hogyan gyorsítótárazza a válaszokat.
A [ResponseCache] részt vesz a válasz gyorsítótárazási fejléceinek beállításában. Az ügyfeleknek és a köztes proxyknak tiszteletben kell tartaniuk a válaszok gyorsítótárazási fejléceit az RFC 9111: HTTP gyorsítótárazásirányelvei szerint.
A HTTP 1.1 gyorsítótárazási specifikációt követő kiszolgálóoldali gyorsítótárazáshoz használja Response Caching Middleware. A köztes szoftver a [ResponseCache] tulajdonságok használatával állíthatja be a kiszolgálóoldali gyorsítótárazás fejléceit.
HTTP-alapú válasz gyorsítótárazása
RFC 9111: HTTP-gyorsítótárazás leírja, hogyan kell az internetes gyorsítótáraknak viselkedniük. A gyorsítótárazáshoz használt elsődleges HTTP-fejléc a Cache-Control, amely a gyorsítótár irányelvekmegadására szolgál. Az irányelvek szabályozzák a gyorsítótárazási viselkedést, mivel a kérések az ügyfelektől a kiszolgálókig vezetnek, a válaszok pedig visszafelé haladnak a kiszolgálókról az ügyfelekre. A kérelmek és válaszok proxykiszolgálókon haladnak át, és a proxykiszolgálóknak is meg kell felelniük a HTTP 1.1 gyorsítótárazási specifikációnak.
A gyakori Cache-Control irányelvek az alábbi táblázatban láthatók.
| Directive | Action |
|---|---|
| public | A gyorsítótár tárolhatja a választ. |
| private | A választ nem szabad megosztott gyorsítótárban tárolni. A privát gyorsítótár tárolhatja és újra felhasználhatja a választ. |
| max-age | Az ügyfél nem fogad el olyan választ, amelynek életkora meghaladja a megadott számú másodpercet. Példák: max-age=60 (60 másodperc), max-age=2592000 (1 hónap) |
| no-cache |
Kérések esetén: A gyorsítótár nem használhat tárolt választ a kérés teljesítéséhez. A forráskiszolgáló újragenerálja az ügyfél válaszát, és a köztes szoftver frissíti a tárolt választ a gyorsítótárában. Válaszokon: A válasz nem használható további kérésekhez a forráskiszolgálón történő ellenőrzés nélkül. |
| no-store |
Kérések esetén: A gyorsítótár nem tárolhatja a kérést. Válaszokon: A gyorsítótár nem tárolhatja a válasz egyik részét sem. |
A gyorsítótárazásban szerepet játszó egyéb gyorsítótárfejlécek az alábbi táblázatban láthatók.
| Header | Function |
|---|---|
| Age | A válasz létrejötte vagy sikeres érvényesítése óta eltelt idő becslése másodpercben a forráskiszolgálón. |
| Expires | Az az idő, amely után a válasz elavultnak minősül. |
| Pragma | A HTTP/1.0 gyorsítótárakkal való visszamenőleges kompatibilitás érdekében létezik a no-cache viselkedés beállításához. Ha a Cache-Control fejléc jelen van, a Pragma fejléc figyelmen kívül lesz hagyva. |
| Vary | Azt határozza meg, hogy a gyorsítótárazott válasz nem küldhető el, ha nem egyeznek az összes Vary fejlécmező mind a gyorsítótárazott válasz eredeti kérésében, mind az új kérésben. |
A HTTP-alapú gyorsítótárazás tiszteletben tartja az Cache-Control irányelveket
RFC 9111: HTTP-gyorsítótárazáshoz (5.2. Cache-Control. szakasz) gyorsítótárra van szükség ahhoz, hogy az ügyfél által küldött érvényes Cache-Control fejlécet tiszteletben tarthassa. Az ügyfél no-cache fejlécértékkel kérheti a kéréseket, és kényszerítheti a kiszolgálót, hogy minden kérésre új választ hozzon létre.
Ha figyelembe veszi a HTTP-gyorsítótárazás célját, érdemes mindig tiszteletben tartani az ügyfél Cache-Control kérésfejléceket. A hivatalos specifikáció szerint a gyorsítótárazás célja, hogy csökkentse az ügyfelek, proxyk és kiszolgálók hálózatán keresztüli kérelmek teljesítésének késését és hálózati terhelését. Ez nem feltétlenül a forráskiszolgáló terhelésének szabályozására szolgál.
A Response Caching Middleware használatakor nincs fejlesztői vezérlés a gyorsítótárazási viselkedés felett, mert a köztes szoftver megfelel a hivatalos gyorsítótárazási specifikációnak. Az kimeneti gyorsítótárazás támogatása a szerver terhelésének jobb szabályozása érdekében egy tervezési javaslat az ASP.NET Core jövőbeli kiadásához. További információért lásd: A kimeneti gyorsítótárazás támogatásának hozzáadása (, dotnet/aspnetcore #27387).
Egyéb gyorsítótárazási technológia a ASP.NET Core-ban
Memóriabeli gyorsítótárazás
A memóriabeli gyorsítótárazás kiszolgálói memóriát használ a gyorsítótárazott adatok tárolásához. Ez a gyorsítótárazási típus alkalmas egyetlen kiszolgálóra vagy több kiszolgálóra, amelyek munkamenet-affinitást használnak. A munkamenet-affinitás más néven ragadós munkamenetek. A munkamenet-affinitás azt jelenti, hogy az ügyféltől érkező kérések mindig ugyanarra a kiszolgálóra vannak irányítva feldolgozás céljából.
További információért lásd: Memóriabeli gyorsítótár az ASP.NET Core-ban és Az Azure Application Gateway munkamenet-affinitási problémáinak hibaelhárítása.
Elosztott gyorsítótár
Elosztott gyorsítótár használatával tárolhatja az adatokat a memóriában, amikor az alkalmazást felhőben vagy kiszolgálófarmban üzemeltetik. A gyorsítótár meg van osztva a kéréseket feldolgozó kiszolgálók között. Az ügyfél elküldhet egy kérelmet, amelyet a csoport bármely kiszolgálója kezel, ha az ügyfél gyorsítótárazott adatai elérhetők. ASP.NET Core az SQL Server, a Redis, a Postgres és az NCache elosztott gyorsítótárakkal működik.
További információért lásd: Az ASP.NET Core elosztott gyorsítótárazása.
Gyorsítótár Tag Helper
Gyorsítótárazza a tartalmat egy MVC-nézetből vagy Razor lapról a Gyorsítótárcímke segéd segítségével. A gyorsítótárcímke-segéd memóriabeli gyorsítótárazással tárolja az adatokat.
További információ: Cache Tag Helper in ASP.NET Core MVC.
Elosztott gyorsítótár-tag segítője
Tárold a tartalmat gyorsítótárban egy MVC-nézetből vagy Razor lapról elosztott felhő- vagy webfarm-környezetekben az Elosztott gyorsítótár címkesegéd segítségével. Az elosztott gyorsítótárcímke-segéd az SQL Servert, a Redis-t vagy a NCache-at használja az adatok tárolásához.
További információért lásd a Elosztott gyorsítótárazási címke segítőt az ASP.NET Core-ben.
ResponseCache attribútum
A ResponseCacheAttribute megadja azokat a paramétereket, amelyek szükségesek a válasz gyorsítótárazásának megfelelő fejlécek beállításához.
Warning
Tiltsa le a hitelesített ügyfelek adatait tartalmazó tartalom gyorsítótárazását. Csak akkor szabad engedélyezni a gyorsítótárazást, ha a tartalom nem változik a felhasználó identitása vagy az alapján, hogy a felhasználó be van-e jelentkezve.
VaryByQueryKeys a tárolt választ a lekérdezési kulcsok megadott listájának értékei alapján határozza meg. Ha egyetlen * értéket ad meg, a köztes szoftver az összes lekérdezési sztringparaméter válaszait eltérően határozza meg.
Response Caching Middleware beállításához engedélyezni kell a VaryByQueryKeys tulajdonság beállítását. Ellenkező esetben a rendszer futásidejű kivételt ad ki. A VaryByQueryKeys tulajdonsághoz nincs megfelelő HTTP-fejléc. A tulajdonság egy HTTP-szolgáltatás, amelyet a Response Caching Middleware kezel. Ahhoz, hogy a köztes réteg gyorsítótárazott választ szolgáljon ki, a lekérdezési karaktersorozatnak és annak értékének meg kell egyeznie egy korábbi kéréssel. Vegyük például az alábbi táblázatban látható kérések és eredmények sorrendjét.
| Request | Result |
|---|---|
http://example.com?key1=value1 |
Vissza a kiszolgálóról. |
http://example.com?key1=value1 |
Middleware által visszaadva. |
http://example.com?key1=value2 |
Vissza a kiszolgálóról. |
Az első kérést a kiszolgáló adja vissza, és a köztes szoftverben gyorsítótárazza. A második kérést a köztes szoftver adja vissza, mert a lekérdezési sztring megegyezik az előző kéréssel. A harmadik kérés nincs a köztes szoftver gyorsítótárában, mert a lekérdezési sztring értéke nem egyezik meg egy korábbi kéréssel.
A ResponseCacheAttribute egy IFilterFactorykonfigurálására és létrehozására szolgál (Microsoft.AspNetCore.Mvc.Internal.ResponseCacheFilterkeresztül). A ResponseCacheFilter elvégzi a megfelelő HTTP-fejlécek és a válasz funkcióinak frissítését. A szűrő:
- Eltávolítja a
Vary,Cache-ControlésPragmameglévő fejléceit. - A megfelelő fejléceket a ResponseCacheAttributemegadott tulajdonságok szerint írja ki.
- Frissíti a válasz gyorsítótárazási HTTP-funkcióját, ha VaryByQueryKeys be van állítva.
Vary
Ez a fejléc csak akkor lesz megírva, ha a VaryByHeader tulajdonság be van állítva. A tulajdonság a Vary tulajdonság értékére van állítva. Az alábbi minta a VaryByHeader tulajdonságot használja:
[ResponseCache(VaryByHeader = "User-Agent", Duration = 30)]
public class Cache1Model : PageModel
{
A mintaalkalmazással megtekintheti a válaszfejléceket a böngésző hálózati eszközeivel. A rendszer a következő válaszfejléceket küldi el a Cache1 lap válaszával:
Cache-Control: public,max-age=30
Vary: User-Agent
NoStore és Location.None
NoStore felülbírálja a többi tulajdonság többségét. Ha ez a tulajdonság trueértékre van állítva, a Cache-Control fejléc beállítása no-storelesz. Ha Location be van állítva None:
-
Cache-Controlno-store,no-cacheértékre van állítva. -
Pragmano-cacheértékre van állítva.
Ha NoStorefalse van, és LocationNonevan, akkor Cache-Controlés Pragmano-cache.
A NoStore általában true-re van beállítva a hibaoldalak esetén. A mintaalkalmazás Cache2 lapja válaszfejléceket hoz létre, amelyek arra utasítják az ügyfelet, hogy ne tárolja a választ.
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public class Cache2Model : PageModel
{
A mintaalkalmazás a Cache2 oldalt adja vissza a következő fejlécekkel:
Cache-Control: no-store,no-cache
Pragma: no-cache
Ha a ResponseCacheAttribute az alkalmazás MVC-vezérlőinek vagy Razor Lapok lapválaszainak mindegyikére alkalmazni szeretné, vegye fel egy MVC szűrővel vagy Razor Lapok szűrővel.
MVC-alkalmazásban:
services.AddMvc().AddMvcOptions(options =>
options.Filters.Add(
new ResponseCacheAttribute
{
NoStore = true,
Location = ResponseCacheLocation.None
}));
Az Razor Pages alkalmazásokra vonatkozó megközelítést lásd: A ResponseCacheAttribute hozzáadása az MVC globális szűrőlistájához nem vonatkozik a Razor Pages oldalakra (dotnet/aspnetcore #18890).
Hely és időtartam
A gyorsítótárazás engedélyezéséhez a Duration pozitív értékre kell állítani, Location pedig Any (alapértelmezett) vagy Clientkell lennie. A keretrendszer a Cache-Control fejlécet először a helyértékre, majd a válasz max-age értékére állítja.
Locationesetén a Any és Client opciók a Cache-Control fejlécértékeket public és private-re alakítják át, sorrendben. Ahogy a NoStore és a Location.None szakaszban is szerepel, a Location beállítása NoneCache-Control és Pragma fejléceket is no-cacheértékre állítja.
Location.Any (Cache-Controlpublic) azt jelzi, hogy a ügyfél vagy bármely köztes proxy gyorsítótárazhatja az értéket, beleértve a válasz gyorsítótárazási köztes szoftvert.
A gyorsítótár-vezérlőfejlécek csupán útmutatást nyújtanak az ügyfelek és a közvetítő proxyk számára a válaszok gyorsítótárazásához. Nincs garancia arra, hogy az ügyfelek és proxyk tiszteletben tartják RFC 9111: HTTP gyorsítótárazási. Response Caching Middleware mindig betartja a specifikációban meghatározott szabályait a gyorsítótárazásnak.
Az alábbi példa a mintaalkalmazás Cache3 oldalmodellét és a Duration beállításával létrehozott fejléceket mutatja be, és hagyja meg az alapértelmezett Location értéket:
[ResponseCache(Duration = 10, Location = ResponseCacheLocation.Any, NoStore = false)]
public class Cache3Model : PageModel
{
A mintaalkalmazás a Cache3 oldalt adja vissza a következő fejléccel:
Cache-Control: public,max-age=10
Gyorsítótár-profilok
Ahelyett, hogy a válaszgyorsítótár-beállításokat számos vezérlőművelet attribútumban duplikálnánk, a gyorsítótárprofilokat beállításokként lehet konfigurálni az MVC/Razor lapok beállításakor a Startup.ConfigureServices. A hivatkozott gyorsítótárprofilban található értékeket használja alapértelmezettként a ResponseCacheAttribute, amelyeket az attribútumban megadott bármely tulajdonság felülír.
Állítson be egy gyorsítótárprofilt. Az alábbi példa egy 30 másodperces gyorsítótárprofilt mutat be a mintaalkalmazás Startup.ConfigureServices:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddMvc(options =>
{
options.CacheProfiles.Add("Default30",
new CacheProfile()
{
Duration = 30
});
});
}
A mintaalkalmazás Cache4-lapmodellje a Default30 gyorsítótárprofilra hivatkozik:
[ResponseCache(CacheProfileName = "Default30")]
public class Cache4Model : PageModel
{
A ResponseCacheAttribute a következőre alkalmazhatók:
- Razor Lapok: Az attribútumok nem alkalmazhatók a kezelői metódusokra.
- MVC-vezérlők.
- MVC műveleti módszerek: A metódusszintű attribútumok felülbírálják az osztályszintű attribútumokban megadott beállításokat.
A Default30 gyorsítótárprofil által a Cache4 oldal válaszára alkalmazott eredményként kapott fejléc:
Cache-Control: public,max-age=30
További erőforrások
- Válaszok tárolása gyorsítótárakban
- RFC 9111: HTTP gyorsítótárazás (5.2. szakasz Cache-Control)
- Memóriabeli gyorsítótárazás ASP.NET Core
- Elosztott gyorsítótárazás ASP.NET Core
- Változások észlelése változási tokenekkel az ASP.NET Core
- Response Caching Middleware az ASP.NET Core
- Cache Tag Helper az ASP.NET Core MVC
- Elosztott gyorsítótár címke segédprogram az ASP.NET Core-ban