页面缓存OutputCache
更新页面缓存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 context, string 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(context, custom);
}
这里想要说的是,我重写方法体里的时间跟页面输出的时间是没有关系的,这里的时间纯粹的为了作一个版本的迭代标识,这里我再贴一个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 属性
缓存用户控件输出的多个版本
如何:使用自定义字符串对页的各个版本进行缓存
页面缓存OutputCache的更多相关文章
- 更新页面缓存OutputCache
为什么要使用OutputCache 我认为OutputCache是最简单的缓存技术了,它针对的是页面级别的,简单的一条指令就可以达到缓存的效果,有效的减轻服务器的压力和减少带宽,对于网站一些不会频繁更 ...
- ASP.NET MVC 阻止当前请求的视图页面缓存OutputCache
设置缓存 [OutputCache(Duration =333,VaryByCustom ="Index")] 缓存: //在action中,临时阻止该次请求的视图页面缓存 Res ...
- .Net页面缓存OutPutCache详解
一 它在Web.Config中的位置 <system.web> <!--页面缓存--> <caching> <outputCacheSettings> ...
- ASP.NET 页面缓存OutputCache用法实例(附ab压力测试对比图)
本文主要介绍Web窗体页面中的使用方法,MVC中使用方法,大家自行百度. 一.简单一行指令即可实现 <%@ OutputCache VaryByParam=" %> 这样整个页面 ...
- Mvc 页面缓存 OutputCache VaryByCustom
优化网站,dotNet MVC 可以通过(OutputCache)特性在某些Action上使用缓存,如果我们想要自定义缓存依据可以通过如下方式进行: 第一步, 在 global.asax.cs 文件中 ...
- [转]Asp.net mvc 网站之速度优化 -- 页面缓存
网站速度优化的一般方法 由于网站最重要的用户体验就是速度,特别是对于电子商务网站而言. 一般网站速度优化会涉及到几个方面: 1. 数据库优化 — 查询字段简历索引,使用数据库连接池和持久化,现在还有种 ...
- Asp.net mvc 网站之速度优化 -- 页面缓存
网站速度优化的一般方法 由于网站最重要的用户体验就是速度,特别是对于电子商务网站而言. 一般网站速度优化会涉及到几个方面: 1. 数据库优化 — 查询字段简历索引,使用数据库连接池和持久化,现在还有种 ...
- [置顶] 页面缓存,cache,设置缓存过期时间,OutputCache
页面缓存 方法一: protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { //缓存有数据 if (Cach ...
- 探索ASP.NET MVC5系列之~~~5.缓存篇(页面缓存+二级缓存)
其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...
随机推荐
- Java清理临时目录文件Demo(一)
/** * 删除单个文件 * * @param sPath * 被删除文件的文件名 * @return 单个文件删除成功返回true,否则返回false */ public static boolea ...
- ios基金会-XCode温馨提示
(一个)代号规格pragma mark 1.定义 #pragma 开头的代码是一条编译器指令,是一个特定于程序或编译器的指令. 不一定适用于其他编译器或其他环境.假设编译器不能识别该指令.则会将其忽略 ...
- Codeforces 527C Glass Carving(Set)
意甲冠军 片w*h玻璃 其n斯普利特倍 各事业部为垂直或水平 每个分割窗格区域的最大输出 用两个set存储每次分割的位置 就能够比較方便的把每次分割产生和消失的长宽存下来 每次分割后剩下 ...
- 从.net复制源代码中国农历阵列,必要做日历
从.net复制源代码中国农历阵列,必要做日历 const { 闰月的月份.春节的阳历日期(农历正月初一).农历的每一个月天数 } c_arrLunarInfo: array [1900 .. 2100 ...
- selenium2入门 定位 窗体切换等等 (二)
定位用的html素材有两个 demo.html <html> <head> <title>UI Automation Testing</title> & ...
- jquery validate remote验证唯一性
jquery.validate.js 的 remote 后台验证 之前已经有一篇关于jquery.validate.js验证的文章,还不太理解的可以先看看:jQuery Validate 表单验证(这 ...
- ubuntu安装nVidia驱动,遇到终端闪砾问题并解决
安装nvidia的官方驱动之后,比起nouvean来说感觉速度快了不少. 安装该驱动很简单,但选择哪个驱动是要注意的.因为今天我试了nvidia的多个驱动后都在ubuntu下用起来并不好. 我现在的环 ...
- 使用hibernate在5秒内插入11万条数据,你觉得可能吗?
需求是这样的,需要查询某几个表的数据,然后插入到另外一个表. 一看到需求,很多人都会用hibernate去把这些数据都查询出来,然后放到list中, 然后再用for循环之类的进行遍历,一条一条的取出数 ...
- jsp连接MySQL数据库显示GIS地理数据乱码问题的解决(select AsText(the_geom))
oh,fuck,经过我昨天下午到今天的努力,终于将这一问题成功解决了,哈哈哈 问题详细描述: 我通过jsp页面连接上MySQL数据库,取出存在表中的地理数据(类型是geometry,具体有POINT. ...
- ps入门教程:选择工具、移动工具、索套工具的使用
本节课程主要内容:1.学习矩形选择工具.椭圆选择工具.移动工具.多边形套索工具.套索工具.磁性套索工具和魔术 棒选择工具.2.用套索和磁性套索,实现对人物照片的抠图.----------------- ...