День 1520. #ЗаметкиНаПолях
Кэширование Вывода в ASP.NET Core. Начало
Кэширование выходных данных — это первоклассная функция в ASP.NET Core 7. Раньше его приходилось реализовывать самостоятельно. Рассмотрим особенности кэширования и как его реализовать.
Кэширование вывода — можно применить в ASP.NET Core для кэширования часто используемых данных, в основном для повышения производительности. Предотвратив чрезмерные вызовы ресурсоемких зависимостей (например, БД или сетевых API), мы можем значительно улучшить время отклика, что является одним из ключей к масштабированию приложений.
Прежде всего, кэширование вывода (Output Caching) сильно отличается от кэширования ответов (Response Caching):
- Ответственность: кэширование ответов возлагает ответственность за кэширование на клиентов (или промежуточные прокси-серверы) путем установки заголовков кэша. Кэширование вывода возлагает ответственность на сервер.
- Носитель данных: кэширование ответов хранится в памяти, тогда как кэширование вывода имеет множество параметров для настройки хранилища.
- Удаление: поскольку мы контролируем кэширование вывода на сервере, у нас есть возможность удалить эти записи кэша. При кэшировании ответов это сложно, поскольку мы не контролируем поведение клиентов.
- Повторная проверка: кэширование вывода может возвращать код ответа 304 Not Modified вместо кэшированного тела ответа. Это поможет сэкономить трафик.
При этом одно не лучше другого и каждый вид имеет разные варианты использования.
Настройка кэширования вывода
Давайте начнем с настройки самого простого примера кэширования вывода:
var builder = WebApplication.CreateBuilder(args);
…
builder.Services.AddControllers();
builder.Services.AddOutputCache();
var app = builder.Build();
…
app.MapControllers();
app.UseOutputCache();
app.Run();
Мы добавляем промежуточное ПО для кэширования вывода в коллекцию сервисов и конвейер запросов.
Рассмотрим простейший метод контроллера, возвращающий случайное число:
public IResult Get()
=> Results.Ok(Random.Shared.Next(100));
При каждом обновлении число меняется. Но если добавить к методу атрибут [OutputCache], то при обновлении результат будет оставаться прежним.
По умолчанию ответ кэшируется на 1 минуту.
Политики
Политики кэширования вывода позволяют настроить кэширование и в самом атрибуте, но лучше сделать это централизованно в Program.cs:
builder.Services.AddOutputCache(opt =>
{
opt.AddBasePolicy(c =>
c.Expire(TimeSpan.FromSeconds(5)));
opt.AddPolicy("CacheTenSec", c =>
c.Expire(TimeSpan.FromSeconds(10)));
});
Здесь мы добавляем две политики:
- Базовая политика по умолчанию кэширует на 5 секунд.
- Политика CacheTenSec кэширует на 10 секунд.
Если удалить атрибут [OutputCache] из нашего метода действия, мы увидим, что ответ кэшируется на 5 секунд. Если добавить атрибут с указанием политики:
[OutputCache(PolicyName="CacheTenSec")]
то ответ будет кэшироваться на 10 секунд. Политики кэширования позволяют централизовано определять стратегии кэширования, избавляя методы действий от лишних атрибутов.
Стоит отметить, что конфигурация кэша по умолчанию принимает некоторые смелые решения:
- кэшируются только ответы HTTP 200,
- кэшируются только ответы GET/HEAD,
- не кэшируются ответы с аутентификацией или cookie.
Это можно переопределить с помощью создания пользовательской политики кэширования вывода.
Продолжение следует…
Источник: https://code-maze.com/aspnet-core-output-caching/