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 rámci RFC 9111: Ukládání do mezipaměti HTTP.
Pro ukládání do mezipaměti na straně serveru, které se řídí specifikací ukládání do mezipaměti HTTP 1.1, použijte Middleware pro ukládání odpovědí 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: Ukládání do mezipaměti HTTP popisuje chování internetových mezipamětí . 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 procházejí proxy servery a proxy servery musí také odpovídat specifikaci ukládání do mezipaměti HTTP 1.1.
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. |
Direktiva 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 se | 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: Ukládání do mezipaměti HTTP (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 Pro ukládání odpovědí do mezipaměti neexistuje žádná kontrola vývojáře nad tímto chováním, 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ělo být povolené jenom pro obsah, který se nemění na základě uživatele identity 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 vlastnost, musí být povolený middleware pro ukládání odpovědí do VaryByQueryKeys 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 zpracovávaná middlewarem ukládání odpovědi do mezipaměti. 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-Control
aPragma
. - Zapíše odpovídající hlavičky na základě vlastností nastavených v objektu ResponseCacheAttribute.
- Aktualizuje funkci HTTP pro ukládání odpovědí do mezipaměti, pokud VaryByQueryKeys je nastavená.
Lišit se
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žeb AddResponseCaching Middleware pro ukládání odpovědí do mezipaměti do kolekce služeb a nakonfiguruje aplikaci tak, aby používala middleware s rozšiřující metodou UseResponseCaching .
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 nano-store,no-cache
hodnotu .Pragma
je nastavena nano-cache
hodnotu .
Pokud NoStore je a Location je None
false
, Cache-Control
a 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 private
v 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-Control
nastaveno na public
hodnotu ) znamená, že klient nebo jakýkoli zprostředkující proxy server mohou hodnotu ukládat do mezipaměti, včetně middlewaru pro ukládání odpovědí do mezipaměti.
Location.Client
(Cache-Control
nastaveno na private
hodnotu ) 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 pro ukládání odpovědí 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: Ukládání do mezipaměti HTTP. Middleware pro ukládání odpovědí do mezipaměti 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
- Ukládání odpovědí v mezipaměti
- Řízení mezipaměti
- Ukládání do mezipaměti v paměti v ASP.NET Core
- Distribuované ukládání do mezipaměti v ASP.NET Core
- Detekce změn pomocí tokenů změn v ASP.NET Core
- Middleware pro ukládání odpovědí do mezipaměti v ASP.NET Core
- Pomocná rutina značek mezipaměti v ASP.NET Core MVC
- Pomocná rutina značek distribuované mezipaměti v ASP.NET Core
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 rámci RFC 9111: Ukládání do mezipaměti HTTP.
Pro ukládání do mezipaměti na straně serveru, které se řídí specifikací ukládání do mezipaměti HTTP 1.1, použijte Middleware pro ukládání odpovědí 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: Ukládání do mezipaměti HTTP popisuje chování internetových mezipamětí . 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 procházejí proxy servery a proxy servery musí také odpovídat specifikaci ukládání do mezipaměti HTTP 1.1.
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. |
Direktiva 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 se | 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: Ukládání do mezipaměti HTTP (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 Pro ukládání odpovědí do mezipaměti neexistuje žádná kontrola vývojáře nad tímto chováním, 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 naleznete v tématu Přidání podpory pro ukládání výstupu 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 Ukládání do mezipaměti v paměti v ASP.NET Core a řešení potíží se spřažením relací brány Aplikace Azure lication.
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ělo být povolené jenom pro obsah, který se nemění na základě uživatele identity 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 vlastnost, musí být povolený middleware pro ukládání odpovědí do VaryByQueryKeys 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 zpracovávaná middlewarem ukládání odpovědi do mezipaměti. 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-Control
aPragma
. - Zapíše odpovídající hlavičky na základě vlastností nastavených v objektu ResponseCacheAttribute.
- Aktualizuje funkci HTTP pro ukládání odpovědí do mezipaměti, pokud VaryByQueryKeys je nastavená.
Lišit se
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 nano-store,no-cache
hodnotu .Pragma
je nastavena nano-cache
hodnotu .
Pokud NoStore je a Location je None
false
, Cache-Control
a 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 private
v 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-Control
nastaveno na public
hodnotu ) znamená, že klient nebo jakýkoli zprostředkující proxy server mohou hodnotu ukládat do mezipaměti, včetně middlewaru pro ukládání odpovědí do mezipaměti.
Location.Client
(Cache-Control
nastaveno na private
hodnotu ) 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 pro ukládání odpovědí 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: Ukládání do mezipaměti HTTP. Middleware pro ukládání odpovědí do mezipaměti 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
{
Dá 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
- Ukládání odpovědí v mezipaměti
- RFC 9111: Ukládání do mezipaměti HTTP (oddíl 5.2. Řízení mezipaměti)
- Ukládání do mezipaměti v paměti v ASP.NET Core
- Distribuované ukládání do mezipaměti v ASP.NET Core
- Detekce změn pomocí tokenů změn v ASP.NET Core
- Middleware pro ukládání odpovědí do mezipaměti v ASP.NET Core
- Pomocná rutina značek mezipaměti v ASP.NET Core MVC
- Pomocná rutina značek distribuované mezipaměti v ASP.NET Core