MVC:缓存Output

更多
2021年01月04日 17点50分 作者:叶飞 修改

OutputCache

使用上文所述的API很灵活,但:

  • 只是缓存UI层获取数据,
  • 而且稍显累赘

所以MVC推出了OutputCache,可以:

  • 直接缓存生成的Html数据
  • 可以声明方式实现
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
    public class OutputCacheAttribute : ActionFilterAttribute, IExceptionFilter

有意思:OutputCache实际上继承自ActionFilterAttribute!

可以看出,OutputCache可适用于Controller(但一般不会)和Action,包括ChildAction。

@想一想@:Action和ChildAction都缓存时的情景?


常用设置

  • Duration:缓存时间,单位秒。这里只能是absolute的,不能slide
  • Location:可设置为已枚举值,确定缓存数据的存放位置,一般是Server(服务器端)、Client(客户端)和Any(任意位置,默认)。注意:设置客户端仅意味着ASP.NET(通过Response Header)给客户端一个请求缓存的指示,不能保证浏览器一定按指示予以缓存。
  • VaryByParam:指示是否根据url参数设置不同的副本,可以填写的值为:
    *
    为不同的url参数(名称/个数/值)缓存不同的副本,
    None(默认)
    忽略url参数的差异,所有不同url参数都共用同一个缓存副本
    分号(;)分隔的参数名,如:id;name
    为指定的url参数缓存不同的副本,忽略未指定的url参数差异
但是:routeData 不是 Params

断点演示:Action中的断点不会被击中,MVC会直接将之前缓存的HTML文件/片段返回给客户端……


Cache Profile

可以在web.config的caching中配置:
      <outputCacheSettings>
        <outputCacheProfiles>
          <add name="RegisterIndex" duration="5" />
        </outputCacheProfiles>
      </outputCacheSettings>

然后,在OutputCache中引用:

    [OutputCache(CacheProfile = "RegisterIndex")]
    public ActionResult Index(int id = 0)

这样,能实现和

    [OutputCache(Duration = 5)]
一样的效果。

@想一想@:为什么还要额外提供这个在web.config中进行配置的CacheProfile选项?

  • 重用
  • 调优:no profile no improvement

此外,还可以直接禁用OutputCache:

      <outputCache enableOutputCache="false"></outputCache>


MVCDonutCache

很多时候,我们希望能缓存一个页面,但是其中的某一个部分例外(如:LogonStatus),怎么办呢?

MVC暂时未能提供内置的支持,我们需要(通过NuGet)引入第三方插件MVCDonutCache (演示:略)

它的实现非常简单:

  1. 将父Action的OutputCache换成DonutOutputCache
        [DonutOutputCache(Duration = 5)]  //需要添加using DevTrends.MvcDonutCaching;
  2. 在@Html.ChildAction()末尾添加一个bool值参数true,如:
        @Html.Action("_Inviter", "Shared", true)

演示:父Action页面和ChildAction页面都显示DateTime.Now


总是使用DonutCache

弥补缺陷


删除



合理使用缓存策略

比如,需要精细化控制的、多个/种页面使用的数据源(文件评论),就适合用编程API的方式,以节省内存空间,避免生成多个View Cache副本(有不同排序方式)

比如,合理的使用ChildAction Cache组合(关键字等Widget/内容列表项),以及DonutCache“挖孔”,都可以提高OutputCache的利用率。

……


ASP.NET 缓存 Output
赞: 0 踩: 0

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
评论 / 0

后台开发


ADO和EF

如何通过C#进行数据库的读取,包含ADO.NET和Entity Framework相关知识……

ASP.NET框架

综合之前所学,连接前端和数据库,包括RazorPage、MVC和其他(如WebForm/WebApi等)技术……

RazorPages(Core)

微软推荐的、最新的、基于Razor页面和.NET core的新一代Web项目开发技术,包括Razor Tag Helper、Model绑定和Validation、Session/Cookie、内置依赖注入等……

MVC(Framework)

过去两年间最流行的、基于.NET Framework和MVC模式的ASP.NET MVC框架,主要用于讲解安全、性能、架构和各种实战功能演示……

C#语法

从入门的变量赋值、分支循环、到面向对象,以及更先进的语言特性,如:泛型、Lambda、Linq、异步方法等…………

Java语法

面向过程的变量赋值、分支循环和函数封装;面向对象的封装、继承和多态;以及更高阶的常用类库(集合/IO/多线程……)、lambda等

Java Web开发

SpringMVC

分层架构和综合实战

全部
关键字



帮助

反馈