zoukankan      html  css  js  c++  java
  • 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 缓存的这个诡异行为,让你在不知不觉中浪费了带宽资源。

  • 相关阅读:
    Ant Design Vue中TreeSelect详解
    ant-design-vue 表单验证详解
    vue3跟新视图遇见神奇现象
    遇见这样的数型结构图我是这样画的
    Ant Design Vue中Table的选中详解
    2021 年百度之星·程序设计大赛
    2021 年百度之星·程序设计大赛
    2021牛客暑期多校训练营7 H. xay loves count(枚举)
    2021牛客暑期多校训练营6 H. Hopping Rabbit(扫描线)
    P1494 [国家集训队]小Z的袜子(莫队)
  • 原文地址:https://www.cnblogs.com/jordan2009/p/3135103.html
Copyright © 2011-2022 走看看