我想将整个页面缓存到ASP.NET Core2.1MVC web应用程序中的分布式缓存(特别是Redis)中。当用户访问页面时,会执行action方法和视图cshtml中的代码,并生成一个页面并将其发送给用户。我希望这个页面在请求的末尾被缓存,这样当后续的用户访问该页面时,它应该从缓存中得到,而不必在操作方法或视图中执行任何代码。更具体地说,我希望它能被缓存在Redis中。我很熟悉如何从web应用程序中在Redis中存储键值对,也熟悉如何将页面的部分缓存到Redis,但我不知道如何将整个页面缓存到Redis。
我已经成功地使用了IDistributedCache接口的Redis特定实现来将密钥值对存储到Redis。这是通过安装Microsoft.Extensions.Caching.Redis.Core NuGet包并将以下语句添加到ConfigureServices()来实现的
services.AddDistributedRedisCache(options =>
{
options.Configuration = "localhost";
options.InstanceName = "SampleInstance";
});一旦完成,我就能够依赖地将Redis IDistributedCache实现注入到控制器中,然后使用_cache.GetStringAsync()和_cache.SetStringAsync()之类的语句来存储和检索到Redis的键值对。我还可以在<distributed-cache>页面中使用.cshtml标记助手来缓存视图的部分。
然而,这些技术并不能帮助我缓存整个页面,只缓存其中的一部分。操作和视图中的代码仍然需要执行,页面需要重新呈现,但速度更快,因为其中一些是缓存的。我想要做的是缓存整个页面,这样就可以在不执行action方法和视图cshtml中的代码的情况下从缓存中获得所有服务。
我还知道如何使用内置功能在ASPCore2.1中实现基本的页面缓存。只需向action方法添加一个[ResponseCaching(Duration=...)]属性,在Startup.cs中分别将services.AddResponseCaching()和app.UseResponseCaching()语句添加到ConfigureServices()和Configure()。不幸的是,页面被缓存在服务器实例中,大概是在服务器的内存中。--我不知道如何告诉它如何将这个页面缓存在Redis中。
基本上,我想要像[ResponseCaching(Duration=..., CACHE=REDIS)]这样的东西。如何做到这一点?
旧ASP.NET 4等效
在ASP.NET 4中,只需向操作添加一个[OutputCache(Duration=...)]属性,安装Microsoft.Web.RedisOutputCacheProvider NuGet包,并将以下内容放入web.config
<caching>
<outputCache defaultProvider="MyRedisOutputCache">
<providers>
<add name="MyRedisOutputCache" type=... host="" ssl="true" />
</providers>
</outputCache>
</caching>整个页面随后将被缓存到Redis。真的很简单。这正是我试图在ASP.Core2.1中复制的功能。
发布于 2021-04-20 04:39:13
您可以使用ASP.NET MVC操作过滤器。
覆盖OnResultExecuted以将最终结果存储在Redis缓存中。
检查OnActionExecuting中是否存在缓存。
html视图之后的OnResultExecuted调用已经准备好,因此您可以存储呈现的html。
操作之前的OnActionExecuting调用,这样您就可以从缓存加载数据。检查此ASP.NET中的链接 MVC操作过滤器。
https://stackoverflow.com/questions/50845429
复制相似问题