Megosztás a következőn keresztül:


Válasz gyorsítótárazása a ASP.NET Core-ban

Rick Anderson és Kirk Larkin

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, amely a gyorsítótár-irányelvek megadá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. 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és Pragmameglé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-Control no-store,no-cacheértékre van állítva.
  • Pragma no-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.

( ) azt jelzi, hogy az értéket csak az ügyfél gyorsítótárazhatja. Nincs olyan köztes gyorsítótár, amelyik gyorsítótárazhatná az értéket, beleértve a Válaszgyorsí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

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és Pragmameglé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-Control no-store,no-cacheértékre van állítva.
  • Pragma no-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.

( ) azt jelzi, hogy az értéket csak az ügyfél gyorsítótárazhatja. Nincs olyan köztes gyorsítótár, amelyik gyorsítótárazhatná az értéket, beleértve a Válaszgyorsí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