当前位置: 首页 > news >正文

注意!ASP.NET MVC 3 的一个 OutputCache 问题

在用 ASP.NET MVC 3 重写博客园网站首页时,特地留意了一下这个缓存问题,通过这篇博文分享一下。

在 ASP.NET MVC 3 中如果使用了 OutputCache,一定要在 Action 中添加下面的代码,切记!

Response.Cache.SetOmitVaryStar(true);

这是一个伴随ASP.NET从1.0到4.0的OutputCache Bug,ASP.NET MVC 3 是基于 ASP.NET 4.0 的,所以也躲不过。

 

问题演示

下面先来体验一下不加 Response.Cache.SetOmitVaryStar(true); 的情况。

示例Action代码:

[OutputCache(Duration = 120)]
public ActionResult SiteHome(int? pageIndex)
{
    ...
}

注:OutputCache.Location的默认值是OutputCacheLocation.Any(服务端、客户端、代理服务器端等都进行缓存)

第一次请求:

第二次请求(F5刷新浏览器):

第三次请求(F5刷新浏览器):

接着第四次请求会返回304,第五次请求又返回200。。。

 

再体验一下加 Response.Cache.SetOmitVaryStar(true); 的情况。

[OutputCache(Duration = 120)]
public ActionResult SiteHome(int? pageIndex)
{
    Response.Cache.SetOmitVaryStar(true);
    ...
}

第一次请求:

第二次请求(F5刷新浏览器):

第三次请求(F5刷新浏览器):

注:只要在缓存有效期内,服务器一直返回304。

 

问题分析

1. 200与304的区别

当返回状态码是200时,服务器端会将当前请求的整个页面全部发送给客户端(消耗下行带宽)。

当返回状态码是304时,由于客户端浏览器提供的 Last-Modified 时间在服务器端的缓存有效期内,服务器端只发送这个状态码,不发送页面的任何内容(几乎不消耗下行带宽),浏览器直接从本地缓存中获取内容。

所以,304的好处就是节约带宽,响应速度更快。

2. 对服务端缓存的影响

加不加 Response.Cache.SetOmitVaryStar(true),服务端的缓存情况都是一样的。只是不加 SetOmitVaryStar(true) 时,对于同一个客户端浏览器,每隔一次请求,服务器端就不管客户端浏览器的缓存,重新发送页面内容,但是只要在缓存有效期内,内容还是从服务器端缓存中读取。

 

问题危害

ASP.NET 缓存的这个诡异行为,让你在不知不觉中浪费了带宽资源。

 

感想

用 ASP.NET 开发多年,这个伴随 ASP.NET 从 1.0 到 4.0 的 OutputCache Bug 自己竟然在去年才发现。之前测试时第一次请求后按F5看返回304就以为没问题,而问题恰恰就在下一下F5,偶尔多按一下F5出现200也没特别留意。由此可见,细心对程序员来说是多么重要,很多bug、很多性能问题往往不是水平不够,而是不够细心。

优秀的程序员都是细心的人,不仅在写代码的时候细心,在生活中也同样细心。别看他木讷的样子,你对他所做的一切,他都会细心地观察到、体会到。做细心的程序员,珍惜细心的程序员!

相关文章:

  • 看到大家对数据库分页有研究,也分享个本人的
  • androidalertDialog无法显示按钮的bug
  • 跟我一起学习ASP.NET 4.5 MVC4.0(四)
  • 顶部菜单栏(固定在顶部)
  • 系统安装后的初始环境设置
  • Leveldb -转
  • 陶哲轩实分析 命题7.2.9 绝对收敛判别法
  • NYOJ467 中缀式变后缀式
  • IHttpModule
  • 陶哲轩实分析 命题 7.4.1 证明
  • ASP.NET Cache的一些总结2
  • css样式表在ie6.0中的hack应用
  • 垃圾代码评析——关于《C程序设计伴侣》6.2(一)
  • vlan划分及vlan间通信
  • 数据结构和算法
  • go语言学习初探(一)
  • GraphQL学习过程应该是这样的
  • JavaScript 基础知识 - 入门篇(一)
  • js如何打印object对象
  • js数组之filter
  • PV统计优化设计
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • Vue2 SSR 的优化之旅
  • XML已死 ?
  • 关于for循环的简单归纳
  • 聊聊flink的BlobWriter
  • 面试总结JavaScript篇
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 小试R空间处理新库sf
  • Mac 上flink的安装与启动
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • !!java web学习笔记(一到五)
  • (9)目标检测_SSD的原理
  • (pytorch进阶之路)扩散概率模型
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (一)SpringBoot3---尚硅谷总结
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .dwp和.webpart的区别
  • .Net - 类的介绍
  • .NET CLR Hosting 简介
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET企业级应用架构设计系列之技术选型
  • :not(:first-child)和:not(:last-child)的用法
  • @Autowired自动装配
  • @DataRedisTest测试redis从未如此丝滑
  • @SuppressWarnings(unchecked)代码的作用