Обложка канала

.NET Разработчик

Опытный разработчик не так давно зашёл в .Net и поставил цель получить сертификат Microsoft. Свой ежедневный прогресс он описывает на канале .Net Разработчик. Заметки об изученном материале, советы по повышению производительности и поддержке мотивации, ин

.NET Разработчик

3 года назад
Открыть в
День 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/