zoukankan      html  css  js  c++  java
  • 更新页面缓存OutputCache

    为什么要使用OutputCache

           我认为OutputCache是最简单的缓存技术了,它针对的是页面级别的,简单的一条指令就可以达到缓存的效果,有效的减轻服务器的压力和减少带宽,对于网站一些不会频繁更新内容的页面,我们可以使用OutputCache来提供性能。

    为什么要更新OutputCache

         作为网站的管理者,肯定要赋予他控制网站每一个部分的能力,假如网站要更新一个内容,而OutputCache还没有失效,难道要重启站点来生效吗?这时候,一个更新OutputCache的功能就显得很有必要了。

    如何更新OutputCache

         一、 webForm

    首先,我们看看OutputCache的效果,在Index.aspx 页面的上面添加这样一条OutputCache指令,意思为页面缓存10秒钟,并且不针对任何的参数。

    <%@ OutputCache Duration="10" VaryByParam="none"%>

    然后再后台Page_Load函数里,输出当前的时间

     public partial class Index : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                Response.Write(DateTime.Now.ToString());
            }
        }

    浏览器查看Index.aspx页面,输出了当前的时间,这很正常,当我们不断的按F5刷新当前页面的时候,我们会发现输出的时间并没有改变,甚至在Page_Load方法体内断点也不会进来,这证明了并没有执行后台函数,当10秒钟过去了,时间也被更新出来了。

    我们现在所要想做的是,在这10秒钟的缓存期过期之前,用我们的办法来更新页面缓存。

    Step1:修改指令,增加 VaryByCustom 属性

    <%@ OutputCache Duration="10" VaryByParam="none"  VaryByCustom="Index_Key" %>

    Step2:新建一个全局应用程序文件Global.asax,并且重写GetVaryByCustomString 方法

            public override string GetVaryByCustomString(HttpContext context, string custom)
            {
                if (custom == "Index_Key")
                {
                    var flag = context.Cache["Index_Key"];
                    if (flag == null)
                    {
                        flag = DateTime.Now.Ticks;
                        context.Cache["Index_Key"] = flag;
                    }
                    return flag.ToString();
                }
                return base.GetVaryByCustomString(context, custom);
            }

    Step3:更新OutputCache的操作

            /// <summary>
            /// 更新OutputCache
            /// </summary>
            protected void btn_UpdateOutputCache_Click(object sender, EventArgs e)
            {
                HttpRuntime.Cache.Remove("Index_Key");
            }

    效果如下图,刷新页面,在缓存里的时间是42秒,

    按照上面的例子,10秒钟内,缓存时间应该都是42秒才对的,现在我们增加了更新OutputCache的功能,点击一下,缓存里的时间被更新了,证明我们这个更新OutputCache是成功的!!

       

      二、MVC

    在MVC中,也有OutputCache,只是不像WebForm那样,在前端页面增加指令,而是在Controller里的Action增加Attribute,下面代码演示了Index这个Action缓存10秒钟,也就是说,10秒钟之内,并不会执行这个Action,而是直接使用缓存。

    public class HomeController : Controller
        {
            [OutputCache(Duration = 10)]
            public ActionResult Index()
            {
                ViewBag.DateTime = DateTime.Now;
                return View();
            }
        }

    View层就简单的打印出来

    @{
        Layout = null;
    }
    
    <!DOCTYPE html>
    
    <html>
    <head>
        <title>Index</title>
    </head>
    <body>
        <div>
            @ViewBag.DateTime 
        </div>
    </body>
    </html>

    效果如下图:不断刷新页面,十秒钟之后,时间被更新了。

    MVC更新OutputCache的思路其实跟WebForm一样,所以这里不再重复了,文章末尾我会给出源码和参考文献,在这里,我想说说我自己对指令中的VaryByCustom属性和重写的方法GetVaryByCustomString的理解,官方的解释很生涩或者不是很详细,所以,还是自己理解比较好。

    我找到MSDN上关于VaryByCustom的两处解释:

    1、

    VaryByCustom

    任何表示自定义输出缓存要求的文本。 如果特性的赋值为 browser,缓存将随浏览器名称和主要版本信息的不同而异。 如果输入自定义字符串,则必须在应用程序的 Global.asax 文件中重写 GetVaryByCustomString 方法。

    2、

    若要以声明方式设置自定义字符串,请在 @OutputCache 指令中包括 VaryByCustom 属性,并将该属性设置为您要作为进行不同输出缓存行为的依据的字符串。

    也就是说,如果指令当中,使用了VaryByCustom,你的页面缓存就会根据你重写方法GetVaryByCustomString 中的返回的字符串的变化决定是否要更新页面缓存。

    我们再来看看GetVaryByCustomString 方法。(再贴一次,这个方法你可以参考MSDN上的做法,我这里是使用了自定义缓存来保存时间,清除OutputCache的操作会清空这个缓存,缓存失效了,就会赋予新的时间,VaryByCustom接受到新的字符串,它也就会知道去更新OutputCache了)

    
    
      public override string GetVaryByCustomString(HttpContext contextstring custom)
            {
                if (custom == "Index_Key"//每个设置了VaryByCustom属性的页面都会进来这个方法,custom为该指令的值
                {
                    var flag = context.Cache["Index_Key"];  //获取自定义缓存中的标示,这里我使用了缓存,你也可以使用别的方法
                    if (flag == null)                       //假如是第一次进来,或者自定义缓存被清空了,就会走下面的方法体
                    {
                        flag = DateTime.Now.Ticks;           //将当前最新时间赋予缓存
                        context.Cache["Index_Key"= flag;
                    }
                    return flag.ToString();         //返回最新时间字符串,页面指令VaryByCustom接受到最新的字符串,发现跟上次的不同,就会更新OutputCache
                }
                return base.GetVaryByCustomString(contextcustom);
            }

    这里想要说的是,我重写方法体里的时间跟页面输出的时间是没有关系的,这里的时间纯粹的为了作一个版本的迭代标识,这里我再贴一个MSDN给出的例子,根据请求浏览器的次版本进行缓存。

    public override string GetVaryByCustomString(HttpContext context, string arg)
    {
        if(arg == "minorversion")
        {
            return "Version=" +
                context.Request.Browser.MinorVersion.ToString();
        }
        return base.GetVaryByCustomString(context, arg);
    }

    参考文章:

    @ OutputCache

    OutputCacheProfile.VaryByCustom 属性

    缓存用户控件输出的多个版本

    如何:使用自定义字符串对页的各个版本进行缓存

    ASP.Net 更新页面输出缓存的几种方法(包括用户控件,iframe,页面缓存等)

    源码下载,包含WebForm和MVC

  • 相关阅读:
    IDataParameter调用存储过程
    ecshop下启用QQ在线服务,并能实时更新QQ在线状态
    交通部
    Java实现第九届蓝桥杯堆的计数
    Java实现第九届蓝桥杯全球变暖
    Java实现第九届蓝桥杯全球变暖
    Java实现第九届蓝桥杯堆的计数
    Java实现第九届蓝桥杯堆的计数
    Java实现第九届蓝桥杯全球变暖
    Java实现第九届蓝桥杯全球变暖
  • 原文地址:https://www.cnblogs.com/waynechan/p/3232672.html
Copyright © 2011-2022 走看看