Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
CacheTagHelper обертывает контент представления и позволяет кэшировать его в памяти сервера.
Он использует тег <cache>
, и весь контент, определенный внутри этого тега, кэшируется в памяти.
Перед кэшированием тег-хелпер проверяет, сохранен ли уже данный контент в MemoryCache. Если контент имеется в кэше,
тогда движку Razor посылается контент из кэша. Если же данного контента не оказывается в кэше,
тогда Razor обрабатывает контент, а тег-хелпер сохраняет контент в memory cache для последующего использования.
Например, пусть у нас есть частичное представление TimeView.cshtml, которое просто выводит текущее время:
<p>Время из DateView: <b>@DateTime.Now.ToString("HH:mm:ss")</b></p>
Пусть оно подключается в какое-нибудь другое представление, например, в Index.cshtml:
<p>Время из Index: <b>@DateTime.Now.ToString("HH:mm:ss")</b></p> <cache> @await Html.PartialAsync("TimeView") </cache>
Здесь вызов частичного представления TimeView помещен в элемент cache, что позволяет кэшировать содержимое частичного представления. И основное представление также выводит текущее время, что позволяет нам сравнить два результата.
И если в течение короткого времени (20 минут) мы несколько раз обратимся к приложению, то увидим, что время из частичного представления застыло и не изменяется:
Рассмотрим атрибуты, которые использует данный тег.
expires-after
указывает, на какое время контент будет кэшироваться. В качестве значения атрибут принимает объект
TimeSpan:
<cache expires-after="@TimeSpan.FromMinutes(10)"> @await Html.PartialAsync("TimeView") </cache>
В данном случае контент кэшируется на 10 минут.
expires-on
указывает, когда именно истечет срок хранения контента в кэше. В качестве значения атрибут принимает объект
DateTime:
<cache expires-on="@DateTime.Now.AddDays(1)"> @await Html.PartialAsync("TimeView") </cache>
Здесь срок кэширования истекает через день.
expires-sliding
определяет, через какое время с момента последнего посещения контент будет удаляться из кэша.
В качестве значения атрибут принимает объект TimeSpan:
<cache expires-sliding="@TimeSpan.FromMinutes(10)"> @await Html.PartialAsync("TimeView") </cache>
vary-by-user
позволяет кэшировать контент отдельно для каждого залогиненного пользователя (для которого установлено значение User.Identity.Name
). При кэшировании к ключу контента в кэше
добавляется логин пользователя. В качестве значения атрибут принимает логическое значение true (надо кэшировать по пользователю) или false:
<cache expires-after="@TimeSpan.FromMinutes(15)" vary-by-user="true"> </cache>
Данный атрибут позволяет кэшировать различные версии одного и того же контента в зависимости от параметров маршрута. В качестве значения атрибут принимает названия параметров через запятую, которые будут учитываться при кэшировании. И затем в кэше для контента к ключу будет добавляться значение параметров:
<cache expires-after="@TimeSpan.FromMinutes(15)" vary-by-route="id"> </cache>
В данном случае будут создаваться разные версии одного и того же контента для разных значений параметра id.
vary-by-query
позволяет кэшировать различные версии контента в зависимости от значений параметров, переданных в запросе.
В качестве значения атрибуту передается список параметров через запятую. При кэшировании к ключу контента в кэше
добавляется значение этих параметров.
<cache vary-by-query="name"> </cache>
Здесь для каждого значения параметра name будут кэшироваться свои копии контента.
Данный атрибут позволяет кэшировать различные версии одного и того же контент в зависимости от значений, которые хранятся в куках. В качестве значения атрибут принимает названия куков через запятую, которые будут учитываться при кэшировании. В ходе кэширования значения этих кук будут добавляться к ключам контента в кэше.
<cache vary-by-cookie="pubid"> </cache>
Здесь предполагается, что наше приложение использует куку "pubid". И для каждого ее значения будут кэшироваться свои копии контента.
vary-by-header
позволяет кэшировать различные версии контента в зависимости от значений заголовков запроса.
В качестве значения атрибуту передается название заголовка запроса. Например, для кэширования разных версий контента для разных браузеров
может использоваться заголовок User-Agent:
<cache vary-by-header="User-Agent"> </cache>
vary-by
позволяет кэшировать различные версии контента в зависимости от произвольного строкового значения.
Например, кэшируем в зависимости от значения ViewBag.Id
:
<cache vary-by="@ViewBag.Id"> </cache>
Определяет приоритет кэшируемого контента. Приоритет может иметь значение, если для размещения кэша не хватает памяти. В этом случае из кэша могут удаляться некоторые объекты. И чем ниже приоритет, тем больше вероятность что данные объекты будут удалены при нехватке памяти.
Атрибут priority
принимает одно из значений перечисления Microsoft.Extensions.Caching.Memory.CacheItemPriority:
Low: низкий приоритет
High: высокий приоритет
NeverRemove: контент никогда не удаляется из кэша
Normal: средний приоритет
Например:
<cache vary-by-user="true" priority="@Microsoft.Extensions.Caching.Memory.CacheItemPriority.Normal"> </cache>