Caching 将整个响应缓存到分布式缓存(Redis)

Caching 将整个响应缓存到分布式缓存(Redis),caching,asp.net-core,redis,asp.net-core-mvc,asp.net-core-2.0,Caching,Asp.net Core,Redis,Asp.net Core Mvc,Asp.net Core 2.0,我想将整个页面缓存到ASP.NET Core 2.1 MVC web应用程序中的分布式缓存(特别是Redis)中。当用户访问一个页面时,将执行action方法和view cshtml中的代码,并生成一个页面并发送给用户。我希望这个页面在请求结束时被缓存,这样当后续用户访问该页面时,它应该从缓存中显示出来,而不必在action方法或视图中执行任何代码。更具体地说,我希望它被缓存在Redis中。我熟悉如何从web应用程序在Redis中存储键值对,也熟悉如何将部分页面缓存到Redis,但我不知道如何将

我想将整个页面缓存到ASP.NET Core 2.1 MVC web应用程序中的分布式缓存(特别是Redis)中。当用户访问一个页面时,将执行action方法和view cshtml中的代码,并生成一个页面并发送给用户。我希望这个页面在请求结束时被缓存,这样当后续用户访问该页面时,它应该从缓存中显示出来,而不必在action方法或视图中执行任何代码。更具体地说,我希望它被缓存在Redis中。我熟悉如何从web应用程序在Redis中存储键值对,也熟悉如何将部分页面缓存到Redis,但我不知道如何将整个页面缓存到Redis

我成功地使用了特定于Redis的
IDistributedCache
接口实现,将键值对存储到Redis。这是通过安装Microsoft.Extensions.Caching.Redis.Core NuGet包并将以下语句添加到
ConfigureServices()
中实现的:

完成后,我就可以将Redis
IDistributedCache
实现注入控制器,然后使用类似于
\u cache.GetStringAsync()
\u cache.SetStringAsync()
的语句来存储和检索Redis的键值对。我还可以在.cshtml页面中使用
标记帮助程序来缓存视图的一部分

但是,这些技术不能帮助我缓存整个页面,只能缓存其中的一部分。操作和视图中的代码仍然需要执行,页面需要重新呈现,尽管由于缓存了部分页面,因此速度更快。我想做的是缓存整个页面,这样就可以从缓存中提供所有内容,而无需执行action方法和view cshtml中的代码

我还了解如何在ASP Core 2.1中使用内置功能实现基本页面缓存。只需将
[responseCache(Duration=…)]
属性添加到action方法中,分别在Startup.cs中将语句
services.addresponseCache()
app.UseResponseCaching()
添加到
ConfigureServices()
Configure()
不幸的是,页面被缓存在服务器实例上,可能在服务器的内存中。我不知道如何告诉它将此页面缓存在Redis中

基本上,我想要类似于
[响应缓存(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中复制的功能。

您可以使用ASP.NET MVC操作过滤器

覆盖OnResultExecuted以将最终结果存储在Redis缓存中

检查OnActionExecuting中是否存在缓存

html视图准备就绪后的OnResultExecuted调用,因此可以存储呈现的html

OnActionExecuting调用在操作之前执行,以便您可以从缓存加载数据。
检查此中的ASP.NET MVC操作筛选器。

这是默认实现。这里重要的一点是它实现了
IResponseCache
,因此请将此作为使用
IDistributedCache
实现响应缓存的指南。
<caching>
    <outputCache defaultProvider="MyRedisOutputCache">
       <providers>
          <add name="MyRedisOutputCache" type=... host="" ssl="true" />
       </providers>
    </outputCache>
</caching>