OutputCache属性详解(一)一Duration、VaryByParam
目录
Duration与CacheProfile属性
Duration:页或用户控件进行缓存的时间(以秒计)。在页或用户控件上设置该特性为来自对象的 HTTP 响应建立了一个过期策略,并将自动缓存页或用户控件输出。
CacheProfile:与该页关联的缓存设置的名称。这是可选特性,默认值为空字符串 ("")。
测试OutputCache准备
在Visual Studio中,新建website项目,并修改页面信息如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<%=DateTime.Now %>
</div>
</form>
</body>
</html>
打开 Fiddler 工具,在浏览器中打开页面,我们可以看到 Fiddler 跟踪到的响应信息如下:

并且每次刷新Fiddler所返回的状态码都是200,而且页面输出时间在不断变化,如下:

我们修改项目,在website下的Web.config文件中添加如下配置:
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<!--name 缓存配置名称
duration 缓存的时间(以秒计)
enabled 指定缓存有效
-->
<add name="outputCache60" duration="60" enabled="true" varyByParam="*" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
<compilation debug="true"/>
</system.web>
并修改页面信息为,增加 <%@ OutputCache CacheProfile="outputCache60" %>:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ OutputCache CacheProfile="outputCache60" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<%=DateTime.Now %>
</div>
</form>
</body>
</html>
同样利用 Fiddler 跟踪,得到的信息如下:

我们可以看到 Response Heades 所返回的Cache与不加缓存时返回的完全不一样(多了 Date 和 Expires 节点),加缓存后的时间范围与配置文件中时间一致,相差60秒(duration="60")。

加缓存后,第一次数据请求的状态为200,而之后请求返回的状态都是304,而且页面所输出的时间一直未变。 (超过60秒后第一次刷新,时间会变化,且状态变为200)
HTTP 304: Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
VaryByParam属性
分号分隔的字符串列表,用于使输出缓存发生变化。默认情况下,这些字符串对应于使用 GET 方法特性发送的查询字符串值,或者使用 POST 方法发送的参数。将该特性设置为多个参数时,对于每个指定参数组合,输出缓存都包含一个不同版本的请求文档。
可能的值包括 none、星号 (*) 以及任何有效的查询字符串或 POST 参数名称。
varyByParam="none" 当 VaryByParam 设置为 none 时,将不考虑任何参数;无论提供什么附加参数,都将向所有用户发送相同的页:
下面是Fiddler跟踪的信息:

可以看到,参数改变时数据请求都是200(第二次为304),但是页面上的数据则全是相同的副本,如下:



VaryByParam =“*”对于每个唯一的请求参数组合,将缓存一个唯一页
如图中所示,不管所传的参数为id,code还是para 只要值有所变化时,就会请求服务器,不会读取缓存数据(需要注意的是资源文件如img,js,css等还是会走缓存的)

而且其页面上的数值也是变化的,如下:



但是,将 VaryByParam 设置为 * 会缓存页的许多不同版本,所以如果您知道缓存变化所依据的参数,建议您在 VaryByParam 特性中显式指定这些参数。
如 varyByParam="id;code" 或者 varyByParam="id" 表示当 id;code 或者 id 参数变化时,发生给客户端不同页。
我这边配置文件修改为
<add name="outputCache60" duration="60" enabled="true" varyByParam="id;code" />
Fiddler跟踪的信息如下:

参数改变都会当成一个新的数据请求,但是返回给客户端的数据则不同,如下:






id和code变化时,输出内容会随参数变化,但para无论参数怎么变化,输出的结果都是一样的。
该章只是简单介绍了Duration,CacheProfile,VaryByParam属性 ,如有错误或者问题请各路大神指正!
作者:释迦苦僧 出处:http://www.cnblogs.com/woxpp/p/3975209.html 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
OutputCache属性详解(一)一Duration、VaryByParam的更多相关文章
- OutputCache属性详解(二)一 Location
目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...
- OutputCache属性详解(三)— VaryByHeader,VaryByCustom
目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...
- OutputCache属性详解(四)— SqlDependency
目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...
- [置顶]
MVC输出缓存(OutputCache参数详解)
1.学习之前你应该知道这些 几乎每个项目都会用到缓存,这是必然的.以前在学校时做的网站基本上的一个标准就是1.搞定增删改查2.页面做的不要太差3.能运行(ps真的有这种情况,答辩验收的时候几个人在讲台 ...
- MVC输出缓存(OutputCache参数详解)
版权声明:本文为博主原创文章,未经博主允许转载随意. https://blog.csdn.net/kebi007/article/details/59199115 1.学习之前你应该知道这些 几乎每个 ...
- css动画-animation各个属性详解(转)
CSS3的animation很容易就能实现各种酷炫的动画,虽然看到别人的成果图会觉得很难,但是如果掌握好各种动画属性,做好酷炫吊炸天的动画都不在话下,好,切入正题. 一.动画属性: 动画属性包括:①a ...
- android:exported 属性详解
属性详解 标签: android 2015-06-11 17:47 27940人阅读 评论(7) 收藏 举报 分类: Android(95) 项目点滴(25) 昨天在用360扫描应用漏洞时,扫描结果, ...
- WPF依赖属性详解
WPF依赖属性详解 WPF 依赖属性 英文译为 Dependency Properties,是WPF引入的一种新类型的属性,在WPF中有着极为广泛的应用,在WPF中对于WPF Dependency P ...
- HTML video 视频标签全属性详解
HTML 5 video 视频标签全属性详解 现在如果要在页面中使用video标签,需要考虑三种情况,支持Ogg Theora或者VP8(如果这玩意儿没出事的话)的(Opera.Mozilla.C ...
随机推荐
- Python Charts库的使用
博客园格式不太好看,可以去本人CSDN博客 http://blog.csdn.net/ashic/article/details/52598664 http://nbviewer.jupyter.or ...
- 黑马程序员_Java基础:序列化(Serializable)与反序列化
------- android培训.java培训.期待与您交流! ---------- 在学习IO中的ObjectOutputStream和ObjectInputStream时,会涉及到序列化和反序列 ...
- lazy?
https://developer.jboss.org/wiki/LazyEJB31timerservicedeploymentstartingJBossAS600M5 2016-09-28 18:5 ...
- 【DP】组合数字
Password Attacker 题意就是给 M 个关键字,组合成 N 字符长度的结果,每一个关键字都必须在 N 位的字符中出现,有多少种可能结果. 范围 1 ≤ M ≤ N ≤ 100. 举例假设 ...
- SQL导入Excel文件
如果表已存在,SQL语句为: insert into aa select * from OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0', 'Data Source=D ...
- 在已有 Xcode 项目中 加入Cordova框架
转自:http://www.jianshu.com/p/656838ae92bc 我们知道,在UIKit中的UIWebView虽然已经提供了很多功能了,比如JavaScript和Objc之间的通信.但 ...
- Java中创建对象的几种方式
Java中创建对象的五种方式: 作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字.使用Cl ...
- GP调用arctoolbox 以Clip为例
GP的功能非常强大,也是GIS建模的一个很重要的工具.在Arcengine中,实现Clip功能很多种方法,可以用IBasicGeoprocessor的clip方法,但是GP无疑是最简单的. publi ...
- cuda计算的分块
gpu的架构分为streaming multiprocessors 每个streaming multiprocessors(SM)又能分步骤执行很多threads,单个SM内部能同时执行的thread ...
- linux redmine 搭建
redmine搭建过程参考:http://www.tuicool.com/articles/InMbym 注意事项: 配置文件必须以2个空格开始 启动(指定了端口,和绑定的IP): ruby bin/ ...