Ukládání odpovědí do mezipaměti v ASP.NET Core
Jan Luo, Rick Andersona Steve Smith
Zobrazit nebo stáhnout ukázkový kód (Jak stáhnout)
Ukládání odpovědí do mezipaměti snižuje počet požadavků, které klient nebo proxy vytvoří na webový server. Ukládání odpovědí do mezipaměti také snižuje množství práce, které webový Server provede k vygenerování odpovědi. Ukládání odpovědí do mezipaměti je řízeno hlavičkami, které určují, jak má klient, proxy a middleware ukládat odpovědi do mezipaměti.
Atribut ResponseCache se účastní nastavení hlaviček ukládání odpovědí do mezipaměti. klienti a zprostředkující proxy servery by měly dodržovat hlavičky pro ukládání odpovědí do mezipaměti v rámci specifikace HTTP 1,1 Ukládání do mezipaměti.
pro ukládání do mezipaměti na straně serveru, které následuje za specifikací protokolu HTTP 1,1 Ukládání do mezipaměti, použijte Ukládání do mezipaměti middleware Response. Middleware může pomocí ResponseCacheAttribute vlastností ovlivnit chování ukládání do mezipaměti na straně serveru.
Ukládání odpovědí na základě protokolu HTTP
specifikace Ukládání do mezipaměti HTTP 1,1 popisuje, jak se mají chovat internetové mezipaměti. Primární hlavičkou HTTP použitou pro ukládání do mezipaměti je řízení mezipaměti, které se používá k určení direktiv mezipaměti. Direktivy řídí chování ukládání do mezipaměti jako požadavky od klientů po servery a jako reakce způsobují od serverů zpátky klientům. žádosti a odpovědi se pohybují přes proxy servery a proxy servery musí splňovat i specifikace Ukládání do mezipaměti HTTP 1,1.
Cache-ControlV následující tabulce jsou uvedeny společné direktivy.
| Směrnici | Akce |
|---|---|
| public | Mezipaměť může ukládat odpověď. |
| hlášen | Odpověď nesmí být uložena sdílenou mezipamětí. Soukromá mezipaměť může uložit a znovu použít odpověď. |
| Maximální stáří | Klient nepřijme odpověď, jejíž stáří je větší než zadaný počet sekund. Příklady: max-age=60 (60 sekund), max-age=2592000 (1 měsíc) |
| No – mezipaměť | V případě požadavků: mezipaměť nesmí k uspokojení požadavku použít uloženou odpověď. Zdrojový server znovu vygeneruje odpověď pro klienta a middleware aktualizuje uloženou odpověď v mezipaměti. Na odpovědích: odpověď nesmí být použita pro následné žádosti bez ověření na zdrojovém serveru. |
| bez uložení | V žádostech: mezipaměť nesmí ukládat požadavek. V odpovědích: mezipaměť nesmí ukládat žádnou část odpovědi. |
Další hlavičky mezipaměti, které hrají roli v mezipaměti, jsou uvedeny v následující tabulce.
| Hlavička | Funkce |
|---|---|
| Age (Věk) | Odhad doby v sekundách, po jejímž uplynutí byla odpověď generována nebo úspěšně ověřena na zdrojovém serveru. |
| Expires | Čas, po jehož uplynutí je odpověď považována za zastaralou. |
| Pragma | Existuje pro zpětnou kompatibilitu s mezipamětí HTTP/1.0 pro no-cache chování nastavení. Pokud Cache-Control je hlavička k dispozici, Pragma záhlaví je ignorováno. |
| Toho | 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í žádosti odpovědi v mezipaměti i v nové žádosti. |
Požadavky na ukládání do mezipaměti založené na protokolu HTTP respektují direktivy Cache-Control
specifikace HTTP 1,1 Ukládání do mezipaměti pro záhlaví Cache-Control vyžaduje mezipaměť, aby bylo možné akceptovat platnou Cache-Control hlavičku odeslanou klientem. Klient může vytvořit požadavky s no-cache hodnotou hlavičky a vynutit, aby server vygeneroval novou odpověď pro každý požadavek.
Použití Cache-Control hlaviček požadavků klienta je vhodné, pokud považujete cíl ukládání http do mezipaměti. V rámci oficiální specifikace je ukládání do mezipaměti určeno ke snížení latence a zatížení sítě při požadavcích na požadavky v síti klientů, proxy serverů a serverů. To není nutně způsob, jak řídit zatížení na zdrojovém serveru.
při použití middlewaru Ukládání do mezipamětiho middlewaru není k dispozici žádné vývojářské řízení, 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í zátěže serveru je návrhem návrhu pro budoucí vydání 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 pro ukládání do mezipaměti v ASP.NET Core
Ukládání do mezipaměti v paměti
Ukládání 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íc serverů pomocí relací s rychlým cvičením. Rychlé relace znamenají, že požadavky klienta jsou vždycky směrovány na stejný server ke zpracování.
Další informace naleznete v tématu Ukládání do mezipaměti v ASP.NET Core.
Distribuovaná mezipaměť
Pomocí distribuované mezipaměti můžete ukládat data v 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 žádost, která je zpracována jakýmkoli serverem ve skupině, pokud jsou k dispozici data uložená v mezipaměti pro klienta. ASP.NET Core pracuje s mezipamětí SQL Server, Redisa NCache distribuované mezipaměti.
Další informace naleznete v tématu Distribuované ukládání do mezipaměti v ASP.NET Core.
Uložení pomocné rutiny značky do mezipaměti
Ukládání obsahu do mezipaměti pro zobrazení nebo Razor stránku MVC pomocí pomocníka značky mezipaměti Pomocník značek Cache používá ukládání dat do mezipaměti v paměti.
Další informace naleznete v tématu pomocná značka značky v ASP.NET Core MVC.
Pomocná rutina značek v distribuované mezipaměti
Ukládání obsahu do mezipaměti pro zobrazení nebo Razor stránku MVC v distribuovaném cloudu nebo ve scénářích webové farmy pomocí pomocníka značek distribuované mezipaměti. pomocný pomocník značek distribuované mezipaměti používá k ukládání dat SQL Server, Redisnebo NCache .
Další informace naleznete v tématu Pomocná služba značek distribuované mezipaměti v ASP.NET Core.
ResponseCache – atribut
ResponseCacheAttributeUrčuje parametry potřebné pro nastavení příslušných hlaviček v ukládání odpovědí do mezipaměti.
Upozornění
Zakáže ukládání do mezipaměti pro obsah, který obsahuje informace pro ověřené klienty. Ukládání do mezipaměti by měla být povolená jenom pro obsah, který se nemění podle identity uživatele nebo jestli je uživatel přihlášený.
VaryByQueryKeys mění uloženou odpověď podle hodnot daného seznamu klíčů dotazů. Pokud * je k dispozici jedna hodnota, middleware se liší odezvy všemi parametry řetězce dotazu na žádosti.
aby bylo možné nastavit vlastnost, musí být povolený middleware Ukládání do mezipaměti pro odpověď VaryByQueryKeys . V opačném případě je vyvolána výjimka modulu runtime. Pro vlastnost není k dispozici odpovídající hlavička protokolu HTTP VaryByQueryKeys . vlastnost je funkce HTTP, kterou zpracovává odpověď Ukládání do mezipaměti middleware. Aby middleware poskytovala odpověď uloženou v mezipaměti, řetězec dotazu a hodnota řetězce dotazu musí odpovídat předchozí žádosti. Zvažte například posloupnost požadavků a výsledků, které jsou uvedeny 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 vrací Server a ukládá do mezipaměti v middlewaru. Druhý požadavek vrací middleware, protože řetězec dotazu odpovídá předchozímu požadavku. Třetí žádost není v mezipaměti middlewaru, protože hodnota řetězce dotazu neodpovídá předchozí žádosti.
ResponseCacheAttributeSlouží ke konfiguraci a vytvoření (prostřednictvím) a IFilterFactory Microsoft.AspNetCore.Mvc.Internal.ResponseCacheFilter . ResponseCacheFilterProvede práci s aktualizací odpovídajících hlaviček protokolu HTTP a funkcí odpovědi. Filtr:
- Odebere všechna existující záhlaví pro
Vary,Cache-ControlaPragma. - Zapíše příslušné hlavičky na základě vlastností nastavených v ResponseCacheAttribute .
- Aktualizuje funkci HTTP ukládání odpovědí do mezipaměti, pokud VaryByQueryKeys je nastavená.
Lišit
Tato hlavička je zapsána pouze v VaryByHeader případě, že je nastavena vlastnost . Vlastnost nastavená Vary na hodnotu vlastnosti. Následující ukázka používá vlastnost VaryByHeader :
[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. S odpovědí stránky Cache1 se odesílaly následující hlavičky odpovědi:
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 nastavená true na , Cache-Control hlavička je nastavená na no-store . Pokud Location je nastavená na None :
Cache-Controlje nastavená nano-store,no-cache.Pragmaje nastavená nano-cache.
Pokud NoStore je a , a jsou false Location None Cache-Control Pragma nastaveny na no-cache .
NoStore pro chybové stránky je true obvykle nastavená na . Stránka Cache2 v ukázkové aplikaci vytváří hlavičky odpovědi, které instruují klienta, aby odpověď neukládá.
[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 hlavičkami:
Cache-Control: no-store,no-cache
Pragma: no-cache
Umístění a doba trvání
Pokud chcete ukládání do mezipaměti povolit, musí být nastavené na kladnou hodnotu a musí Duration Location být buď Any (výchozí), nebo Client . Rozhraní nastaví Cache-Control hlavičku na hodnotu umístění následovanou max-age hodnotou odpovědi .
Locationse překládají na hodnoty hlaviček a Any ( ) v uvedeném Client Cache-Control public private pořadí. Jak je u položky NoStore a Location.None, nastavení nastavuje Location hlavičky i None Cache-Control na Pragma no-cache .
Location.Any( nastavená na ) označuje, že klient nebo jakýkoli zprostředkující proxy server může hodnotu ukládat do mezipaměti, včetně odpovědi Cache-Control public Ukládání do mezipaměti middlewaru.
Location.Client ( Cache-Control nastavená na private ) označuje, že hodnotu může ukládat do mezipaměti pouze klient. Žádná zprostředkující mezipaměť by neměla hodnotu ukládat do mezipaměti, včetně odpovědi Ukládání do mezipaměti middlewaru.
Hlavičky ovládacích panelů mezipaměti pouze poskytují pokyny pro klienty a zprostředkující proxy, kdy a jak ukládat odpovědi do mezipaměti. Neexistuje žádná záruka, že klienti a profesionálové budou respektovat specifikaci http 1.1 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 a Duration ponechání 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ů akcí kontroleru je možné profily mezipaměti nakonfigurovat jako možnosti při nastavování MVC/ Razor stránek v Startup.ConfigureServices . Hodnoty nalezené v odkazovaném profilu mezipaměti se používají jako výchozí hodnoty a jsou přepsány libovolnými vlastnostmi zadanými ResponseCacheAttribute v atributu .
Nastavení profilu mezipaměti Následující příklad ukazuje 30sekunerový profil mezipaměti v souboru ukázkové Startup.ConfigureServices aplikace:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddMvc(options =>
{
options.CacheProfiles.Add("Default30",
new CacheProfile()
{
Duration = 30
});
});
}
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.CacheProfiles.Add("Default30",
new CacheProfile()
{
Duration = 30
});
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
Model stránky Cache4 ukázkové aplikace odkazuje na Default30 profil mezipaměti:
[ResponseCache(CacheProfileName = "Default30")]
public class Cache4Model : PageModel
{
ResponseCacheAttributeLze použít pro:
- Razor Stránky: Atributy nelze použít u metod 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á na odezvu stránky Cache4 Default30 profilem mezipaměti:
Cache-Control: public,max-age=30
Další zdroje informací
- Ukládání odpovědí do mezipaměti
- Řízení mezipaměti
- Ukládání do mezipaměti v ASP.NET Core
- Distribuované ukládání do mezipaměti v ASP.NET Core
- Zjišťovat změny pomocí tokenů změn v ASP.NET Core
- Odpověď Ukládání do mezipaměti middlewaru v ASP.NET Core
- pomocná značka značky v ASP.NET Core MVC
- Pomocná služba značek distribuované mezipaměti v ASP.NET Core