我想将整个页面缓存到ASP.NET Core 2.1 MVC Web应用程序中的分布式缓存(特别是Redis)。当用户访问页面时,执行action方法和视图cshtml中的代码,并生成页面并将其发送给用户。我希望在请求结束时缓存此页面,以便当后续用户访问页面时,它应该从缓存中呈现,而不必在操作方法或视图中执行任何代码。更具体地说,我希望它可以在Redis中缓存。我熟悉如何在Web应用程序中存储Redis中的键值对,并且熟悉如何将页面的某些部分缓存到Redis,但我无法弄清楚如何缓存整个页面致Redis。
我已成功使用Redis特定的IDistributedCache
接口实现将键值对存储到Redis。这是通过安装Microsoft.Extensions.Caching.Redis.Core NuGet包并将以下语句添加到ConfigureServices()
来实现的:
services.AddDistributedRedisCache(options =>
{
options.Configuration = "localhost";
options.InstanceName = "SampleInstance";
});
完成后,我能够将Redis IDistributedCache
实现依赖注入控制器,然后使用_cache.GetStringAsync()
和_cache.SetStringAsync()
等语句来存储和检索键值对Redis的。我还可以在.cshtml页面中使用<distributed-cache>
标记帮助程序来缓存视图的各个部分。
但是这些技术无法帮助我缓存整个页面,只能缓存部分内容。操作和视图中的代码仍然需要执行,并且页面需要重新渲染,尽管速度更快,因为其中一些是缓存的。我想要做的是缓存整个页面,以便可以从缓存中提供所有内容,而无需在action方法和视图cshtml中执行代码。
我也知道如何使用内置功能在ASP Core 2.1中完成基本页面缓存。所有人需要做的是在操作方法中添加[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 Core 2.1中复制的功能。
答案 0 :(得分:0)
您可以使用 ASP.NET MVC 操作过滤器。
覆盖 OnResultExecuted 以将最终结果存储在 Redis 缓存中。
检查 OnActionExecuting 中是否存在缓存。
在 html 视图准备好后调用 OnResultExecuted,因此您可以存储呈现的 html。
在操作之前调用 OnActionExecuting 以便您可以从缓存加载数据。 检查此 link 中的 ASP.NET MVC 操作过滤器。