
Кешируем отдачу картинок в .NET MVC Core
sadomovalex 52 минуты назад Кешируем отдачу картинок в .NET MVC Core Средний 6 мин 1.8K .NET * Кейс Всем привет. В этой статье хочу поделиться опытом добавления клиентского кеширования картинок в ASP.NET MVC Core...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. sadomovalex 52 минуты назад Кешируем отдачу картинок в . NET MVC Core Средний 6 мин 1. NET * Кейс Всем привет.
В этой статье хочу поделиться опытом добавления клиентского кеширования картинок в ASP. NET MVC Core приложении. В мире SaaS экономия машинных ресурсов - актуальная задача, которая тем актуальнее, чем больше клиентов обслуживается на "единицу железа" (если можно так выразиться).
Технические детали
Традиционно, генерация и отдача картинок на бэкенде - достаточно CPU и memory-емкие операции, и добавление клиентского кеша с помощью HTTP заголовков Cache-Control помогает снизить нагрузку на железо. Допустим, у нас есть контроллер ImageController с действием View, которое умеет отдавать запрошенное изображение из бд, на лету изменяя его размеры, чтобы они не превышали переданных maxWidth и maxHeight:public class ImageController : Controller { public ActionResult ViewResized(int id, int maxWidth, int maxHeight) { ... return new ; } }(конкретную реализацию приводить не буду, т.
статья в первую очередь о кэшировании, а не о работе с изображениями)Мы хотим добавить клиентский кэш, добавив в ответ сервера заголовок Cache-Control. Это можно сделать несколькими способами:Декларативно, добавив аттрибут на действие// Добавляет заголовок: Cache-Control: public, max-age=60 public ActionResult ViewResized(int id, int maxWidth, int maxHeight)Изменив код самого действияpublic ActionResult ViewResized(int id, int maxWidth, int maxHeight) { Response. CacheControl = new ; ...
}Добавив промежуточный слой (middleware) для кэшированияЯ не люблю смешивать функциональные и нефункциональные аспекты, поэтому буду использовать третий вариант с промежуточным слоем. Он позволит сохранить код самого действия "чистым", а также динамически изменять срок действия кэша, читая его например из бд или файла конфигурации. Код промежуточного слоя выглядит следующим образом:internal class ImageCacheMiddleware: MiddlewareWithService { private readonly RequestDelegate next; public ImageCacheMiddleware(RequestDelegate next) { this.
Отраслевые последствия
next = next; } public async Task Invoke(HttpContext context) { var settingsProvider = context. GetService(); int imageCacheIntervalInSeconds = settingsProvider. Get("ImageCacheIntervalInSeconds if (imageCacheIntervalInSeconds > 0) { context.
OnStarting(() => { // add the header only if it hasn't been set by a controller already if (! ContainsKey("Cache-Control { context. Append("Cache-Control", $"public, max-age={imageCacheIntervalInSeconds} } return Task.
CompletedTask; }); } await next. Invoke(context); } }Сначала мы получаем экземпляр ISettingsProvider (наш интерфейс, абстрагирующий работу с хранилищем настроек. Конкретная реализация зависит от специфики приложения, поэтому его реализацию я здесь не буду приводить.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





