Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
Атрибут ResponseCache представляет еще один инструмент кэширования. Он предполагает установку в ответе клиенту заголовков кэширования, которые определяют, как клиент и промежуточные прокси-серверы должны кэшировать ответ на своей стороне. При этом ResponseCache не выполняет кэширование на сервере! Его суть - только в установке отправляемых заголовков.
Заголовок кэширования - это обычные заголовки, которые определяются спецификацией протокола HTTP и которые позволяют управлять кэшированием. То есть это заголовки Cache-Control, Pragma и Vary.
Основным из них является заголовок Cache-Control
, который может принимать следующие значения:
public
: ответ будет кэшироваться везде - и на машине клиента, и на промежуточных прокси-серверах
private
: ответ будет кэшироваться только на компьютере клиента, но промежуточные прокси-серверы не будут выполнять кэширование
no-cache
: ответ нигде не будет кэшироваться
max-age
: время кэширования
Для настройки заголовоков ответа атрибут ResponseCacheAttribute определяет следующие свойства:
Duration: устанавливает максимальное время кэширования в секундах. Является обязательным, если свойство NoStore
не равно true. Duration добавляет к заголовку Cache-Control
значение max-age
с устанавливаемым временным промежутком в секундах
Location: определяет место кэширования. Принимает одно из значений из перечисления ResponseCacheLocation:
Any
: ответ кэшируется везде (в том числе и на прокси-серверах). Является значением по умолчанию
Client
: ответ кэшируется только на компьютере клиента
None
: ответ нигде не кэшируется
NoStore: определяет, будет ли ответ кэшироваться. Если равен true
, то ответ не кэшируется, а значения свойств
Location
и Duration
игнорируются. Кроме того, заголовку Cache-Control
добавляется значение no-store
VaryByHeader: устанавливает заголовок vary
CacheProfileName: определяет имя профиля кэширования
Order: устанавливает порядок данного атрибута при применении к методу контроллера одновременно нескольких атрибутов
Атрибут ResponseCache может применяться к классам и методам контроллеров, а также к методам RazorPages.
Для практического применения возьмем проект по типу ASP.NET Core Web App (Model-View-Controller) и применим атрибут к какому-нибудь методу контроллера данный атрибут. Сначала отключим любое кэширование:
public class HomeController : Controller { [ResponseCache(NoStore =true, Location =ResponseCacheLocation.None)] public IActionResult Index() { return View(); } }
Здесь атрибут применяется к стандартному методу Index. Значение NoStore =true
добавляет к заголовку Cache-Control значение no-store
,
а значение Location =ResponseCacheLocation.None
добавляет к Cache-Control значение no-cache
Теперь обратимся в браузере к этому методу:
Как видно, браузер клиента получил установленные заголовки:
Cache-Control: no-store,no-cache Pragma: no-cache
Мы можем перезагрузить страницу, и опять будет идти обращение к серверу, поскольку кэширование не выполняется. Теперь изменим атрибут:
[ResponseCache(Location =ResponseCacheLocation.Any, Duration =300)] public IActionResult Index() { return View(); }
Теперь будет выполняться кэширование, так как я явным образом использовал значение Location =ResponseCacheLocation.Any
(оно применяется по умолчанию,
поэтому его можно опускать). Кроме того, срок жизни кэша будет составлять 300 секунд, то есть 5 минут.
Перезапустим приложение, и теперь заголовок Cache-Control будет иметь другое значение:
Cache-Control: public,max-age=300
И если в течение следующих 300 секунд мы снова обратимся к методу Index, например, перейдем по ссылке в нашем приложении, которая ведет на этот метод, то ответ будет извлекаться из кэша браузера:
Если у нас все методы контроллера должны отправлять одни и те же заголовки кэширования, то мы можем применить данный атрибут ко всему сразу контроллеру.
Однако если же атрибут с одинаковыми правилами должен применяться к нескольким, но не ко всем методам контроллера, то в этом случае для сокращения кода мы можем определить и использовать
профиль кэширования. Для этого перейдем к методу ConfigureServices
класса Startup и изменим его следующим образом:
using Microsoft.AspNet.Mvc; //........................ public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(options => { options.CacheProfiles.Add("Caching", new CacheProfile() { Duration = 300 }); options.CacheProfiles.Add("NoCaching", new CacheProfile() { Location = ResponseCacheLocation.None, NoStore = true }); }); }
Каждый профиль кэширования представлен объектом CacheProfile из пространства имен Microsoft.AspNetCore.Mvc. Для
добавления профиля применяется метод options.CacheProfiles.Add()
, в который передается название профиля и собственно профиль.
Объект профиля устанавливает все те свойства, что и атрибут ResponseCacheAttribute.
Здесь добавляется два профиля, при необходимости мы можем добавить профилей, сколько нам надо. И затем в атрибуте ResponseCache нам надо указать имя нужного профиля через параметр CacheProfileName:
[ResponseCache(CacheProfileName = "NoCaching")] public IActionResult Index() { return View(); }