Ukládání odpovědí do mezipaměti v ASP.NET Core

Autoři: Rick Anderson a Kirk Larkin

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Ukládání odpovědí do mezipaměti snižuje počet požadavků, které klient nebo proxy server provádí na webový server. Ukládání odpovědí do mezipaměti také snižuje množství práce, kterou webový server provádí za účelem vygenerování odpovědi. Ukládání odpovědí do mezipaměti je nastavené v hlavičkách.

Atribut ResponseCache nastaví hlavičky ukládání odpovědí do mezipaměti. Klienti a zprostředkující proxy servery by měli dodržovat hlavičky pro ukládání odpovědí do mezipaměti v dokumentu RFC 9111: HTTP Ukládání do mezipaměti.

Pro ukládání do mezipaměti na straně serveru, které se řídí specifikací HTTP 1.1 Ukládání do mezipaměti, použijte middleware response Ukládání do mezipaměti. Middleware může použít ResponseCacheAttribute vlastnosti k ovlivnění chování ukládání do mezipaměti na straně serveru.

Middleware pro ukládání odpovědí do mezipaměti:

  • Umožňuje ukládání odpovědí serveru do mezipaměti na základě hlaviček mezipaměti HTTP. Implementuje standardní sémantiku ukládání do mezipaměti HTTP. Mezipaměti založené na hlavičkách mezipaměti HTTP, jako jsou proxy servery.
  • Aplikace uživatelského rozhraní, jako Razor jsou stránky, obvykle nejsou užitečné, protože prohlížeče obvykle nastavují hlavičky požadavků, které brání ukládání do mezipaměti. Ukládání výstupu do mezipaměti, které je dostupné v ASP.NET Core 7.0 a novějších, přináší výhody aplikací uživatelského rozhraní. Při ukládání výstupu do mezipaměti se konfigurace rozhodne, co se má ukládat do mezipaměti nezávisle na hlavičkách HTTP.
  • Může být přínosné pro veřejné požadavky rozhraní GET nebo HEAD API od klientů, u kterých jsou splněny podmínky pro ukládání do mezipaměti .

Pokud chcete otestovat ukládání odpovědí do mezipaměti, použijte Fiddler nebo jiný nástroj, který může explicitně nastavit hlavičky požadavků. Pro testování ukládání do mezipaměti se explicitně upřednostňuje nastavení hlaviček. Další informace naleznete v tématu Poradce při potížích.

Ukládání odpovědí založených na protokolu HTTP do mezipaměti

RFC 9111: HTTP Ukládání do mezipaměti popisuje, jak se mají chovat internetové mezipaměti. Primární hlavička HTTP použitá pro ukládání do mezipaměti je Cache-Control, která se používá k určení direktiv mezipaměti. Direktivy řídí chování při ukládání do mezipaměti, protože požadavky činí cestu od klientů k serverům a odpovědím se z serverů zpět k klientům. Požadavky a odpovědi se přesouvají přes proxy servery a proxy servery musí také odpovídat specifikaci protokolu HTTP 1.1 Ukládání do mezipaměti.

Běžné Cache-Control direktivy jsou uvedeny v následující tabulce.

Direktiva Akce
public Odpověď může uložit mezipaměť.
private Odpověď nesmí být uložena sdílenou mezipamětí. Soukromá mezipaměť může ukládat a opakovaně používat odpověď.
max-age Klient nepřijímá odpověď, jejíž věk je větší než zadaný počet sekund. Příklady: max-age=60 (60 sekund), max-age=2592000 (1 měsíc)
no-cache U požadavků: Mezipaměť nesmí pro splnění požadavku používat uloženou odpověď. Původní server znovu vygeneruje odpověď pro klienta a middleware aktualizuje uloženou odpověď v mezipaměti.

U odpovědí: Odpověď nesmí být použita pro následný požadavek bez ověření na zdrojovém serveru.
no-store Na žádostech: Mezipaměť nesmí požadavek ukládat.

U odpovědí: Mezipaměť nesmí ukládat žádnou část odpovědi.

Další hlavičky mezipaměti, které hrají roli v ukládání do mezipaměti, jsou uvedeny v následující tabulce.

Hlavička Function
Věk Odhad doby v sekundách od vygenerování nebo úspěšného ověření odpovědi na zdrojovém serveru.
Vyprší Čas, po kterém je odpověď považována za za zastaralou.
Pragma Existuje pro zpětnou kompatibilitu s mezipamětí HTTP/1.0 pro nastavení no-cache chování. Cache-Control Pokud je záhlaví k dispozici, Pragma záhlaví se ignoruje.
Lišit Určuje, že odpověď uložená v mezipaměti nesmí být odeslána, pokud se všechna Vary pole hlaviček shodují v původním požadavku odpovědi uložené v mezipaměti i v novém požadavku.

Ukládání do mezipaměti založené na protokolu HTTP respektuje direktivy Cache-Control požadavků.

RFC 9111: HTTP Ukládání do mezipaměti (oddíl 5.2. Řízení mezipaměti) vyžaduje, aby mezipaměť respektovaná platná Cache-Control hlavička odeslaná klientem. Klient může vyžadovat požadavky s no-cache hodnotou hlavičky a vynutit, aby server vygeneroval novou odpověď pro každý požadavek.

Pokud se domníváte, že cílem ukládání do mezipaměti HTTP je vždy respektovat hlavičky požadavků klienta Cache-Control , dává smysl. V rámci oficiální specifikace je ukládání do mezipaměti určené ke snížení latence a síťové režie při plnění požadavků v síti klientů, proxy serverů a serverů. Není to nutně způsob, jak řídit zatížení na zdrojovém serveru.

Při použití middlewaru Response Ukládání do mezipaměti Middleware neexistuje žádná kontrola nad tímto chováním při ukládání do mezipaměti, protože middleware dodržuje oficiální specifikaci ukládání do mezipaměti. Podpora ukládání výstupu do mezipaměti pro lepší řízení zatížení serveru byla přidána v .NET 7. Další informace naleznete v tématu Ukládání výstupu do mezipaměti.

Atribut ResponseCache

Určuje ResponseCacheAttribute parametry nezbytné pro nastavení odpovídajících hlaviček v ukládání odpovědí do mezipaměti.

Upozorňující

Zakažte ukládání do mezipaměti pro obsah, který obsahuje informace pro ověřené klienty. Ukládání do mezipaměti by měl být povolený jenom pro obsah, který se nemění na základě identity uživatele nebo jestli je přihlášený.

VaryByQueryKeys Liší se uložená odpověď podle hodnot daného seznamu klíčů dotazu. Pokud je k dispozici jedna hodnota * , middleware se liší podle všech parametrů řetězce dotazu požadavku.

Aby bylo možné nastavit VaryByQueryKeys vlastnost, musí být povolen middleware odpovědi Ukládání do mezipaměti. V opačném případě se vyvolá výjimka modulu runtime. Pro vlastnost neexistuje odpovídající hlavička VaryByQueryKeys HTTP. Vlastnost je funkce HTTP, kterou zpracovává Middleware Ukládání do mezipaměti Response. Aby middleware obsluhoval odpověď uloženou v mezipaměti, musí řetězec dotazu a hodnota řetězce dotazu odpovídat předchozímu požadavku. Představte si například posloupnost požadavků a výsledků zobrazených v následující tabulce:

Žádost Vráceno z
http://example.com?key1=value1 Server
http://example.com?key1=value1 Middleware
http://example.com?key1=NewValue Server

První požadavek vrátí server a ukládá se do mezipaměti v middlewaru. Druhý požadavek je vrácen middlewarem, protože řetězec dotazu odpovídá předchozímu požadavku. Třetí požadavek není v mezipaměti middlewaru, protože hodnota řetězce dotazu neodpovídá předchozímu požadavku.

Slouží ResponseCacheAttribute ke konfiguraci a vytvoření (prostřednictvím IFilterFactory) a Microsoft.AspNetCore.Mvc.Internal.ResponseCacheFilter. Provede ResponseCacheFilter aktualizaci odpovídajících hlaviček HTTP a funkcí odpovědi. Filtr:

  • Odebere všechny existující hlavičky pro Vary, Cache-Controla Pragma.
  • Zapíše odpovídající hlavičky na základě vlastností nastavených v objektu ResponseCacheAttribute.
  • Aktualizace funkci HTTP pro ukládání odpovědí do mezipaměti, pokud VaryByQueryKeys je nastavená.

Lišit

Tato hlavička se zapíše pouze v případě, že je vlastnost nastavena VaryByHeader . Vlastnost nastavená na Vary hodnotu vlastnosti. Následující ukázka používá VaryByHeader vlastnost:

[ApiController]
public class TimeController : ControllerBase
{
    [Route("api/[controller]")]
    [HttpGet]
    [ResponseCache(VaryByHeader = "User-Agent", Duration = 30)]
    public ContentResult GetTime() => Content(
                      DateTime.Now.Millisecond.ToString());

Zobrazte hlavičky odpovědi pomocí Fiddleru nebo jiného nástroje. Hlavičky odpovědi zahrnují:

Cache-Control: public,max-age=30
Vary: User-Agent

Předchozí kód vyžaduje přidání služby AddResponseCaching Middleware response Ukládání do mezipaměti do kolekce služby a nakonfiguruje aplikaci tak, aby používala middleware s rozšiřující metodouUseResponseCaching.

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 a Location.None

NoStore přepíše většinu ostatních vlastností. Pokud je tato vlastnost nastavena na true, hlavička je nastavena Cache-Control na no-store. Pokud Location je nastavená hodnota None:

  • Cache-Control je nastavena na no-store,no-cachehodnotu .
  • Pragma je nastavena na no-cachehodnotu .

Pokud NoStore je a Location je Nonefalse , Cache-Controla Pragma jsou nastaveny na no-cache.

NoStore je obvykle nastavená na true chybové stránky. Následující příkaz vytvoří hlavičky odpovědi, které klientovi dávají pokyn, aby odpověď neukládaly.

[Route("api/[controller]/ticks")]
[HttpGet]
[ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)]
public ContentResult GetTimeTicks() => Content(
                  DateTime.Now.Ticks.ToString());

Předchozí kód obsahuje následující hlavičky v odpovědi:

Cache-Control: no-store,no-cache
Pragma: no-cache

Pokud chcete použít ResponseCacheAttribute všechny odpovědi na stránku MVC nebo Razor kontroleru MVC aplikace, přidejte ji pomocí filtru MVC nebo Razor filtru Stránek.

V aplikaci MVC:

builder.Services.AddControllersWithViews().AddMvcOptions(options => 
    options.Filters.Add(
        new ResponseCacheAttribute
        {
            NoStore = true, 
            Location = ResponseCacheLocation.None
        }));

Přístup, který platí pro Razor aplikace Pages, najdete v tématu Přidání ResponseCacheAttribute do globálního seznamu filtrů MVC se nevztahuje na Razor stránky (dotnet/aspnetcore #18890). Příklad uvedený v komentáři k problému byl napsán pro aplikace, které cílí na ASP.NET Core před vydáním minimálních rozhraní API ve verzi 6.0. V případě aplikací verze 6.0 nebo novější změňte registraci služby v příkladu na builder.Services.AddSingleton...Program.cs.

Umístění a doba trvání

Chcete-li povolit ukládání do mezipaměti, Duration musí být nastavena na kladnou hodnotu a Location musí být buď Any (výchozí) nebo Client. Architektura nastaví hlavičku Cache-Control na hodnotu umístění následovanou max-age odpovědí.

Locationmožnosti Any a Client překládají se na Cache-Control hodnoty public záhlaví a privatev uvedeném pořadí. Jak je uvedeno v oddílu NoStore a Location.None , nastavení Location pro None nastavení obou Cache-Control a Pragma záhlaví na no-cache.

Location.Any(Cache-Controlnastaveno na public) označuje, že klient nebo jakýkoli zprostředkující proxy může hodnotu ukládat do mezipaměti, včetně odpovědi Ukládání do mezipaměti Middleware.

Location.Client (Cache-Control nastaveno na privatehodnotu ) označuje, že hodnotu může ukládat do mezipaměti pouze klient . Do mezipaměti by neměla být uložena žádná zprostředkující mezipaměť, včetně middlewaru Response Ukládání do mezipaměti.

Hlavičky řízení mezipaměti poskytují pokyny pro klienty a zprostředkující proxy servery, kdy a jak ukládat odpovědi do mezipaměti. Neexistuje žádná záruka, že klienti a proxy servery budou respektovat RFC 9111: HTTP Ukládání do mezipaměti. Odpověď Ukládání do mezipaměti Middleware vždy dodržuje pravidla ukládání do mezipaměti stanovená specifikací.

Následující příklad ukazuje hlavičky vytvořené nastavením Duration a ponecháním výchozí Location hodnoty:

[Route("api/[controller]/ms")]
[HttpGet]
[ResponseCache(Duration = 10, Location = ResponseCacheLocation.Any, NoStore = false)]
public ContentResult GetTimeMS() => Content(
                  DateTime.Now.Millisecond.ToString());

Předchozí kód obsahuje následující hlavičky v odpovědi:

Cache-Control: public,max-age=10

Profily mezipaměti

Místo duplikování nastavení mezipaměti odpovědí u mnoha atributů akce kontroleru je možné profily mezipaměti nakonfigurovat jako možnosti při nastavování MVC/Razor Pages. Hodnoty nalezené v profilu odkazované mezipaměti se používají jako výchozí hodnoty a jsou přepsány ResponseCacheAttribute všemi vlastnostmi zadanými v atributu.

Následující příklad ukazuje 30sekundový profil mezipaměti:

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();

Následující kód odkazuje na Default30 profil mezipaměti:

[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());
}

Výsledná odpověď hlavičky Default30 profilu mezipaměti zahrnuje:

Cache-Control: public,max-age=30

Atribut [ResponseCache] lze použít na:

  • Razor Stránky: Atributy nelze použít pro metody obslužné rutiny. Prohlížeče používané s aplikacemi uživatelského rozhraní brání ukládání odpovědí do mezipaměti.
  • Kontrolery MVC.
  • Metody akcí MVC: Atributy na úrovni metody přepíší nastavení zadaná v atributech na úrovni třídy.

Následující kód použije [ResponseCache] atribut na úrovni kontroleru a na úrovni metody:

[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());
}

Další materiály

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Ukládání odpovědí do mezipaměti snižuje počet požadavků, které klient nebo proxy server provádí na webový server. Ukládání odpovědí do mezipaměti také snižuje množství práce, kterou webový server provádí za účelem vygenerování odpovědi. Ukládání odpovědí do mezipaměti se řídí hlavičkami, které určují, jak chcete, aby klient, proxy server a middleware odpovědi ukládaly do mezipaměti.

Účastní [ResponseCache] se nastavení hlaviček ukládání odpovědí do mezipaměti. Klienti a zprostředkující proxy servery by měli dodržovat hlavičky pro ukládání odpovědí do mezipaměti v dokumentu RFC 9111: HTTP Ukládání do mezipaměti.

Pro ukládání do mezipaměti na straně serveru, které se řídí specifikací HTTP 1.1 Ukládání do mezipaměti, použijte middleware response Ukládání do mezipaměti. Middleware může pomocí [ResponseCache] vlastností nastavit hlavičky ukládání do mezipaměti na straně serveru.

Ukládání odpovědí založených na protokolu HTTP do mezipaměti

RFC 9111: HTTP Ukládání do mezipaměti popisuje, jak se mají chovat internetové mezipaměti. Primární hlavička HTTP použitá pro ukládání do mezipaměti je Cache-Control, která se používá k určení direktiv mezipaměti. Direktivy řídí chování při ukládání do mezipaměti, protože požadavky činí cestu od klientů k serverům a odpovědím se z serverů zpět k klientům. Požadavky a odpovědi se přesouvají přes proxy servery a proxy servery musí také odpovídat specifikaci protokolu HTTP 1.1 Ukládání do mezipaměti.

Běžné Cache-Control direktivy jsou uvedeny v následující tabulce.

Direktiva Akce
public Odpověď může uložit mezipaměť.
private Odpověď nesmí být uložena sdílenou mezipamětí. Soukromá mezipaměť může ukládat a opakovaně používat odpověď.
max-age Klient nepřijímá odpověď, jejíž věk je větší než zadaný počet sekund. Příklady: max-age=60 (60 sekund), max-age=2592000 (1 měsíc)
no-cache U požadavků: Mezipaměť nesmí pro splnění požadavku používat uloženou odpověď. Původní server znovu vygeneruje odpověď pro klienta a middleware aktualizuje uloženou odpověď v mezipaměti.

U odpovědí: Odpověď nesmí být použita pro následný požadavek bez ověření na zdrojovém serveru.
no-store Na žádostech: Mezipaměť nesmí požadavek ukládat.

U odpovědí: Mezipaměť nesmí ukládat žádnou část odpovědi.

Další hlavičky mezipaměti, které hrají roli v ukládání do mezipaměti, jsou uvedeny v následující tabulce.

Hlavička Function
Věk Odhad doby v sekundách od vygenerování nebo úspěšného ověření odpovědi na zdrojovém serveru.
Vyprší Čas, po kterém je odpověď považována za za zastaralou.
Pragma Existuje pro zpětnou kompatibilitu s mezipamětí HTTP/1.0 pro nastavení no-cache chování. Cache-Control Pokud je záhlaví k dispozici, Pragma záhlaví se ignoruje.
Lišit Určuje, že odpověď uložená v mezipaměti nesmí být odeslána, pokud se všechna Vary pole hlaviček shodují v původním požadavku odpovědi uložené v mezipaměti i v novém požadavku.

Ukládání do mezipaměti založené na protokolu HTTP respektuje direktivy Cache-Control požadavků.

RFC 9111: HTTP Ukládání do mezipaměti (oddíl 5.2. Řízení mezipaměti) vyžaduje, aby mezipaměť respektovaná platná Cache-Control hlavička odeslaná klientem. Klient může vyžadovat požadavky s no-cache hodnotou hlavičky a vynutit, aby server vygeneroval novou odpověď pro každý požadavek.

Pokud se domníváte, že cílem ukládání do mezipaměti HTTP je vždy respektovat hlavičky požadavků klienta Cache-Control , dává smysl. V rámci oficiální specifikace je ukládání do mezipaměti určené ke snížení latence a síťové režie při plnění požadavků v síti klientů, proxy serverů a serverů. Není to nutně způsob, jak řídit zatížení na zdrojovém serveru.

Při použití middlewaru Response Ukládání do mezipaměti Middleware neexistuje žádná kontrola nad tímto chováním při ukládání do mezipaměti, protože middleware dodržuje oficiální specifikaci ukládání do mezipaměti. Podpora ukládání výstupu do mezipaměti pro lepší řízení zatížení serveru je návrh pro budoucí verzi ASP.NET Core. Další informace najdete v tématu Přidání podpory pro výstupní Ukládání do mezipaměti (dotnet/aspnetcore #27387).

Další technologie ukládání do mezipaměti v ASP.NET Core

Ukládání do mezipaměti v paměti

Ukládání dat do mezipaměti v paměti používá paměť serveru k ukládání dat uložených v mezipaměti. Tento typ ukládání do mezipaměti je vhodný pro jeden server nebo více serverů používajících spřažení relací. Spřažení relací se také označuje jako rychlé relace. Spřažení relace znamená, že požadavky z klienta se vždy směrují na stejný server ke zpracování.

Další informace najdete v tématu Mezipaměť v paměti v ASP.NET Core a řešení potíží se spřažením relací brány Aplikace Azure.

Distribuovaná mezipaměť

Použijte distribuovanou mezipaměť k ukládání dat do paměti, když je aplikace hostovaná v cloudové nebo serverové farmě. Mezipaměť se sdílí mezi servery, které zpracovávají požadavky. Klient může odeslat požadavek, který zpracovává jakýkoli server ve skupině, pokud jsou k dispozici data uložená v mezipaměti pro klienta. ASP.NET Core funguje s distribuovanými mezipaměťmi SQL Serveru, Redis a NCache .

Další informace naleznete v tématu Distribuované ukládání do mezipaměti v ASP.NET Core.

Pomocná rutina značky mezipaměti

Obsah můžete ukládat do mezipaměti ze zobrazení MVC nebo Razor stránky pomocí pomocné rutiny značek mezipaměti. Pomocná rutina značek mezipaměti používá ukládání dat do mezipaměti.

Další informace najdete v tématu Pomocné rutiny značek mezipaměti v ASP.NET Core MVC.

Pomocná rutina značky distribuované mezipaměti

Obsah můžete ukládat do mezipaměti ze zobrazení MVC nebo Razor stránky v distribuovaných cloudových scénářích nebo ve scénářích webové farmy pomocí pomocné rutiny značek distribuované mezipaměti. Pomocník značky distribuované mezipaměti používá k ukládání dat SQL Server, Redis nebo NCache .

Další informace naleznete v nápovědě značky distribuované mezipaměti v ASP.NET Core.

Atribut ResponseCache

Určuje ResponseCacheAttribute parametry nezbytné pro nastavení odpovídajících hlaviček v ukládání odpovědí do mezipaměti.

Upozorňující

Zakažte ukládání do mezipaměti pro obsah, který obsahuje informace pro ověřené klienty. Ukládání do mezipaměti by měl být povolený jenom pro obsah, který se nemění na základě identity uživatele nebo jestli je přihlášený.

VaryByQueryKeys Liší se uložená odpověď podle hodnot daného seznamu klíčů dotazu. Pokud je k dispozici jedna hodnota * , middleware se liší podle všech parametrů řetězce dotazu požadavku.

Aby bylo možné nastavit VaryByQueryKeys vlastnost, musí být povolen middleware odpovědi Ukládání do mezipaměti. V opačném případě se vyvolá výjimka modulu runtime. Pro vlastnost neexistuje odpovídající hlavička VaryByQueryKeys HTTP. Vlastnost je funkce HTTP, kterou zpracovává Middleware Ukládání do mezipaměti Response. Aby middleware obsluhoval odpověď uloženou v mezipaměti, musí řetězec dotazu a hodnota řetězce dotazu odpovídat předchozímu požadavku. Představte si například posloupnost požadavků a výsledků zobrazených v následující tabulce.

Žádost Výsledek
http://example.com?key1=value1 Vráceno ze serveru.
http://example.com?key1=value1 Vráceno z middlewaru.
http://example.com?key1=value2 Vráceno ze serveru.

První požadavek vrátí server a ukládá se do mezipaměti v middlewaru. Druhý požadavek je vrácen middlewarem, protože řetězec dotazu odpovídá předchozímu požadavku. Třetí požadavek není v mezipaměti middlewaru, protože hodnota řetězce dotazu neodpovídá předchozímu požadavku.

Slouží ResponseCacheAttribute ke konfiguraci a vytvoření (prostřednictvím IFilterFactory) a Microsoft.AspNetCore.Mvc.Internal.ResponseCacheFilter. Provede ResponseCacheFilter aktualizaci odpovídajících hlaviček HTTP a funkcí odpovědi. Filtr:

  • Odebere všechny existující hlavičky pro Vary, Cache-Controla Pragma.
  • Zapíše odpovídající hlavičky na základě vlastností nastavených v objektu ResponseCacheAttribute.
  • Aktualizace funkci HTTP pro ukládání odpovědí do mezipaměti, pokud VaryByQueryKeys je nastavená.

Lišit

Tato hlavička se zapíše pouze v případě, že je vlastnost nastavena VaryByHeader . Vlastnost nastavená na Vary hodnotu vlastnosti. Následující ukázka používá VaryByHeader vlastnost:

[ResponseCache(VaryByHeader = "User-Agent", Duration = 30)]
public class Cache1Model : PageModel
{

Pomocí ukázkové aplikace zobrazte hlavičky odpovědí pomocí síťových nástrojů prohlížeče. Následující hlavičky odpovědi se posílají pomocí odpovědi stránky Cache1:

Cache-Control: public,max-age=30
Vary: User-Agent

NoStore a Location.None

NoStore přepíše většinu ostatních vlastností. Pokud je tato vlastnost nastavena na true, hlavička je nastavena Cache-Control na no-store. Pokud Location je nastavená hodnota None:

  • Cache-Control je nastavena na no-store,no-cachehodnotu .
  • Pragma je nastavena na no-cachehodnotu .

Pokud NoStore je a Location je Nonefalse , Cache-Controla Pragma jsou nastaveny na no-cache.

NoStore je obvykle nastavená na true chybové stránky. Stránka Cache2 v ukázkové aplikaci vytvoří hlavičky odpovědí, které klientovi dávají pokyn, aby odpověď neukládala.

[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public class Cache2Model : PageModel
{

Ukázková aplikace vrátí stránku Cache2 s následujícími záhlavími:

Cache-Control: no-store,no-cache
Pragma: no-cache

Pokud chcete použít ResponseCacheAttribute všechny odpovědi na stránku MVC nebo Razor kontroleru MVC aplikace, přidejte ji pomocí filtru MVC nebo Razor filtru Stránek.

V aplikaci MVC:

services.AddMvc().AddMvcOptions(options => 
    options.Filters.Add(
        new ResponseCacheAttribute
        {
            NoStore = true, 
            Location = ResponseCacheLocation.None
        }));

Přístup, který platí pro Razor aplikace Pages, najdete v tématu Přidání ResponseCacheAttribute do globálního seznamu filtrů MVC se nevztahuje na Razor stránky (dotnet/aspnetcore #18890).

Umístění a doba trvání

Chcete-li povolit ukládání do mezipaměti, Duration musí být nastavena na kladnou hodnotu a Location musí být buď Any (výchozí) nebo Client. Architektura nastaví hlavičku Cache-Control na hodnotu umístění následovanou max-age odpovědí.

Locationmožnosti Any a Client překládají se na Cache-Control hodnoty public záhlaví a privatev uvedeném pořadí. Jak je uvedeno v oddílu NoStore a Location.None , nastavení Location pro None nastavení obou Cache-Control a Pragma záhlaví na no-cache.

Location.Any(Cache-Controlnastaveno na public) označuje, že klient nebo jakýkoli zprostředkující proxy může hodnotu ukládat do mezipaměti, včetně odpovědi Ukládání do mezipaměti Middleware.

Location.Client (Cache-Control nastaveno na privatehodnotu ) označuje, že hodnotu může ukládat do mezipaměti pouze klient . Do mezipaměti by neměla být uložena žádná zprostředkující mezipaměť, včetně middlewaru Response Ukládání do mezipaměti.

Hlavičky řízení mezipaměti poskytují pouze pokyny pro klienty a zprostředkující proxy servery, kdy a jak ukládat odpovědi do mezipaměti. Neexistuje žádná záruka, že klienti a proxy servery budou respektovat RFC 9111: HTTP Ukládání do mezipaměti. Odpověď Ukládání do mezipaměti Middleware vždy dodržuje pravidla ukládání do mezipaměti stanovená specifikací.

Následující příklad ukazuje model stránky Cache3 z ukázkové aplikace a hlavičky vytvořené nastavením Duration a ponecháním výchozí Location hodnoty:

[ResponseCache(Duration = 10, Location = ResponseCacheLocation.Any, NoStore = false)]
public class Cache3Model : PageModel
{

Ukázková aplikace vrátí stránku Cache3 s následující hlavičkou:

Cache-Control: public,max-age=10

Profily mezipaměti

Místo duplikování nastavení mezipaměti odpovědí u mnoha atributů akce kontroleru lze profily mezipaměti nakonfigurovat jako možnosti při nastavování MVC/Razor Stránky v Startup.ConfigureServices. Hodnoty nalezené v profilu odkazované mezipaměti se používají jako výchozí hodnoty a jsou přepsány ResponseCacheAttribute všemi vlastnostmi zadanými v atributu.

Nastavte profil mezipaměti. Následující příklad ukazuje 30sekundový profil mezipaměti v ukázkové aplikaci Startup.ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddMvc(options =>
    {
        options.CacheProfiles.Add("Default30",
            new CacheProfile()
            {
                Duration = 30
            });
    });
}

Model stránky Cache4 ukázkové aplikace odkazuje na Default30 profil mezipaměti:

[ResponseCache(CacheProfileName = "Default30")]
public class Cache4Model : PageModel
{

ResponseCacheAttribute se použít na:

  • Razor Stránky: Atributy nelze použít pro metody obslužné rutiny.
  • Kontrolery MVC.
  • Metody akcí MVC: Atributy na úrovni metody přepíší nastavení zadaná v atributech na úrovni třídy.

Výsledná hlavička použitá pro odpověď stránky Cache4 profilem Default30 mezipaměti:

Cache-Control: public,max-age=30

Další materiály