Атрибут ResponseCache

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

Последнее обновление: 20.12.2019

Атрибут 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

Теперь обратимся в браузере к этому методу:

Response Caching ASP.NET MVC Core

Как видно, браузер клиента получил установленные заголовки:

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, например, перейдем по ссылке в нашем приложении, которая ведет на этот метод, то ответ будет извлекаться из кэша браузера:

Кэширование в ASP.NET Core

Профили кэширования

Если у нас все методы контроллера должны отправлять одни и те же заголовки кэширования, то мы можем применить данный атрибут ко всему сразу контроллеру. Однако если же атрибут с одинаковыми правилами должен применяться к нескольким, но не ко всем методам контроллера, то в этом случае для сокращения кода мы можем определить и использовать профиль кэширования. Для этого перейдем к методу 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();
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850