Отключаем HTTP-Кэширование по Умолчанию в ASP.NET Core API
При создании API в ASP.NET Core крайне важно явно контролировать поведение кэширования. В отличие от веб-страниц, где кэширование часто улучшает пользовательский опыт, ответы API не следует кэшировать по умолчанию, если вы намеренно не предусмотрели возможность их кэширования. Непреднамеренное кэширование может привести к серьёзным проблемам, включая устаревшие данные, уязвимости безопасности и трудновоспроизводимые ошибки.
Стандарты кэширования в HTTP
Кэширование HTTP регулируется RFC 7234 (Кэширование в HTTP/1.1) и RFC 9111 (HTTP Кэширование). В соответствии с этими спецификациями, кэши разных уровней могут хранить ответы и предоставлять их без обращения к исходному серверу, используя заголовки, такие как
Cache-Control, Expires, ETag и Last-Modified.При отсутствии заголовков кэши могут применять эвристическое истечение срока действия, кэшируя ответы API даже без явных на то указаний. Это особенно проблематично, поскольку браузеры и промежуточные кэши (такие как CDN, прокси или кэши шлюзов) могут использовать собственные алгоритмы для определения того, как долго хранить ответ.
Реализация промежуточного ПО с запретом кэширования
Чтобы гарантировать, что ответы API не будут кэшироваться по умолчанию, реализуйте промежуточное ПО, которое устанавливает соответствующие заголовки управления кэшированием. Оно добавляет необходимые заголовки, чтобы предотвратить кэширование, если вы явно не переопределите их в конкретных контроллерах или действиях.
Вот как создать такое промежуточное ПО:
internal sealed class
NoCacheMiddleware(RequestDelegate next)
{
public async Task InvokeAsync(HttpContext ctx)
{
ctx.Response.OnStarting(() =>
{
// Устанавливаем заголовки no-cache, только если не были установлены явно
if (ctx.Response.Headers.CacheControl.Count is 0)
ctx.Response.Headers.CacheControl =
"no-cache,no-store,must-revalidate";
return Task.CompletedTask;
});
await next(ctx);
}
}
Регистрируем наше промежуточное ПО в конвейере:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseMiddleware<NoCacheMiddleware>();
app.MapGet("/", () => "Hello World!");
app.Run();
Источник: https://www.meziantou.net/disable-http-caching-by-default-in-asp-net-core-apis.htm