Я хотел бы кэшировать всю страницу в распределенный кеш (в частности, Redis) в веб-приложении ASP.NET Core 2.1 MVC. Когда пользователь посещает страницу, выполняется код метода действия и представления cshtml, и страница создается и отправляется пользователю. Я хотел бы, чтобы эта страница кэшировалась в конце запроса, чтобы при посещении страницы последующими пользователями она представлялась из кеша без необходимости выполнять какой-либо код в методе действия или представлении. А точнее, я бы хотел, чтобы это было кешировано в Redis. Я знаком с тем, как хранить пары ключ-значение в Redis из веб-приложения, а также знаком с тем, как кэшировать части страницы в Redis, но я не могу понять, как кэшировать страницу весь в Redis.
Я успешно использовал специфичную для Redis реализацию интерфейса IDistributedCache для хранения пар ключ-значение в Redis. Это было достигнуто путем установки пакета NuGet Microsoft.Extensions.Caching.Redis.Core и добавления следующего оператора в ConfigureServices():
services.AddDistributedRedisCache(options =>
{
options.Configuration = "localhost";
options.InstanceName = "SampleInstance";
});
Как только это было сделано, я смог внедрить реализацию Redis IDistributedCache в контроллер, а затем использовать такие операторы, как _cache.GetStringAsync() и _cache.SetStringAsync(), для хранения и извлечения пар ключ-значение в Redis. Я также могу использовать помощник тега <distributed-cache> на странице .cshtml для кеширования частей представления.
Однако эти методы не помогают мне кэшировать страницу весь, только ее части. Код в действии и представлении все еще необходимо выполнить, а страницу необходимо повторно отрисовать, хотя и быстрее, поскольку часть ее кэшируется. Что я хотел бы сделать, так это кэшировать страницу весь, чтобы все можно было обслуживать из кеша без выполнения кода в методе действия и представлении cshtml.
Я также знаю, как можно выполнить базовое кэширование страниц в ASP Core 2.1 с использованием встроенных функций. Все, что нужно сделать, это добавить атрибут [ResponseCaching(Duration=...)] к методу действия, добавить операторы services.AddResponseCaching() и app.UseResponseCaching() к ConfigureServices() и Configure() соответственно в Startup.cs. К сожалению, страница кэшируется на экземпляре сервера, предположительно в памяти сервера. Я не могу понять, как указать ему кэшировать эту страницу в Redis.
В основном я хочу что-то вроде [ResponseCaching(Duration=..., CACHE=REDIS)]. Как этого добиться?
Старый эквивалент ASP.NET 4
В ASP.NET 4 можно просто добавить к действию атрибут [OutputCache(Duration=...)], установить пакет NuGet Microsoft.Web.RedisOutputCacheProvider и поместить следующее в web.config
<caching>
<outputCache defaultProvider = "MyRedisOutputCache">
<providers>
<add name = "MyRedisOutputCache" type=... host = "" ssl = "true" />
</providers>
</outputCache>
</caching>
И впоследствии вся страница будет кэширована в Redis. Это было действительно просто. Это именно та функциональность, которую я пытаюсь воспроизвести в ASP Core 2.1.





вы можете использовать фильтры действий ASP.NET MVC.
перезаписать OnResultExecuted, чтобы сохранить окончательный результат в кеше Redis.
проверьте, существует ли кеш в OnActionExecuting.
вызов OnResultExecuted после того, как представление html будет готово, чтобы вы могли сохранить визуализированный html.
вызов OnActionExecuting перед действием, чтобы вы могли загружать данные из кеша. проверьте фильтры действий ASP.NET MVC в этом ссылка на сайт.
Это реализация по умолчанию github.com/aspnet/ResponseCaching/blob/dev/src/…. Здесь важно то, что он реализует
IResponseCache, поэтому используйте его в качестве руководства для реализации кеша ответов с использованиемIDistributedCache.