OutputCache属性详解(二)一 Location
目录
Web应用程序中的使用缓存位置:
- 客户端缓存(Client Caching)
- 代理缓存(Proxy Caching)
- 反向代理缓存(Reverse Proxy Caching)
- 服务器缓存(Web Server Caching)
Location:OutputCacheLocation 枚举值之一。
使用该枚举指定的值。这些值确定页输出的缓存位置。默认值为 Any。
- Any:输出缓存可位于产生请求的浏览器客户端、参与请求的代理服务器(或任何其他服务器)或处理请求的服务器上。此值对应于 HttpCacheability.Public 枚举值。
- Client:输出缓存位于产生请求的浏览器客户端上。此值对应于 HttpCacheability.Private 枚举值。
- Downstream:输出缓存可存储在任何 HTTP 1.1 可缓存设备中,源服务器除外。这包括代理服务器和发出请求的客户端。
- None:对于请求的页,禁用输出缓存。此值对应于 HttpCacheability.NoCache 枚举值。
- Server:输出缓存位于处理请求的 Web 服务器上。此值对应于 HttpCacheability.Server 枚举值。
- ServerAndClient:输出缓存只能存储在源服务器或发出请求的客户端中。代理服务器不能缓存响应。此值对应于 HttpCacheability.Private 和 HttpCacheability.Server 枚举值的组合。
测试前准备,新建WebSite站点,配置文件增加:
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<!--name 缓存配置名称
duration 缓存的时间(以秒计)
enabled 指定缓存有效
-->
<add name="outputCache60" duration="60" enabled="true" varyByParam="*" location="Any" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
<compilation debug="true"/>
</system.web>
增加两个页面Default.aspx和Default2.aspx如下:
<%@ 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>
<a href="Default2.aspx" target="_blank">Default2.aspx</a>
</form>
</body>
</html>
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %> <!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 id="Head1" runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<%=DateTime.Now %>
</div>
<a href="Default.aspx" >Default.aspx</a>
</form>
</body>
</html>
Any:输出缓存可位于产生请求的浏览器客户端、参与请求的代理服务器(或任何其他服务器)或处理请求的服务器上。
<add name="outputCache60" duration="60" enabled="true" varyByParam="*" location="Any" />
在客户端,第一次请求为HTTP状态码为200,第二次请求的HTTP状态码为304
第一次HTTP的请求和响应信息如下(200):


第二次HTTP的请求和响应信息如下(304):


我们可以看到,第二次请求时,请求标头里多了个If-Modified-Since和Last-Modified标签:
- 客户端发HTTP请求时,使用If-Modified-Since标签,把上次服务器告诉它的文件最后修改时间 返回到服务器端了。
- 因为文件被改动过,两边时间不一致,所以服务器返回的HTTP状态码是200,并发送新页面的全 部内容。
- 服务器返回的HTTP头标签中有Last-Modified,告诉客户端页面的新的最后修改时间。
Cache-control大家也可以看下
并且第二次响应中并没有来自服务端响应数据,Any在多个客户端统一请求该页面的情况下,反馈给客户端的数据都是一致的,也就是从服务端获取的。(PS:这点与Client不同),如下:

Client:输出缓存位于产生请求的浏览器客户端上。
<add name="outputCache60" duration="60" enabled="true" varyByParam="*" location="Client" />
第一次数据请求与响应情况如下:


客户端缓存,如果用户在浏览器中点击“后退”按钮或在地址栏中重新输入URL,那么在这种情况下,浏览器将从缓存获取页面;然而,如果用户点击“刷新”按钮,那么浏览器中缓存将失效,浏览器发送页面请求。但是浏览器做回退操作时,本身就可以读取自身的缓存数据,这样抓取的数据没有意义,所以我们第二次抓取的顺序需要是:
1.第一次进入Default.aspx页面(抓取一次Default.aspx)
2.点击 Default2.aspx 链接
3.进入Deafult2.aspx页面后,点击页面中的Default.aspx链接跳转回来(抓取一次Default.aspx)
这时候我们抓取的才是真正的304而不是浏览器自带的304。
第二次请求抓取的请求与相应数据,如下图:


可以看出设置成Client时,第二次请求时,在请求头中,客户端与服务端的链接已经断开,没有任何请求服务端的操作,且响应的状态码为304,读取本地缓存。
多个客户端同时请求时,其反馈的数据不一致,如下:

Downstream:输出缓存可存储在任何 HTTP 1.1 可缓存设备中,源服务器除外。这包括代理服务器和发出请求的客户端。
<add name="outputCache60" duration="60" enabled="true" varyByParam="*" location="Downstream" />
个人感觉Downstream与Clinet类似,只不过有两个小区别:
- 数据存储空间和数据存储模式不一样,后面会总结
- Cache-Control,Client为private、Downstream 为 public
我们按照Clinet的方式继续抓取两次的请求与响应信息如下:
第一次请求与响应:


第二次请求与响应,与clinet完全一致,且在多个客户端下数据也不同。


None:对于请求的页,禁用输出缓存。此值对应于 HttpCacheability.NoCache 枚举值。
<add name="outputCache60" duration="60" enabled="true" varyByParam="*" location="None" />
我们继续按抓取Clinet的方式抓取两次请求和响应信息,如下:
第一次请求与响应:


第二次请求与响应:


可以看到两次的请求与响应一致,且返回状态码都是200,在Cache-Control信息中为no-cache,响应信息中也不夹带任何缓存相关的标签。
private、must-revalidate、max-age、no-cache 对于浏览器操作的访问大家可以看下
在多个客户端请求时,页面所展示的信息不会一致。
Server:输出缓存位于处理请求的 Web 服务器上。此值对应于 HttpCacheability.Server 枚举值。
<add name="outputCache60" duration="60" enabled="true" varyByParam="*" location="Server" />
继续按抓取Clinet的方式抓取两次请求和响应信息,如下:




可以看到HTTP请求与响应的数据与设置为None 类似,但是在多个客户端的情况下,Server的数据能保持一致,但None则不能。
ServerAndClient:输出缓存只能存储在源服务器或发出请求的客户端中。代理服务器不能缓存响应。此值对应于 HttpCacheability.Private 和 HttpCacheability.Server 枚举值的组合。
继续按抓取Clinet的方式抓取两次请求和响应信息,如下:




看请求与设置为Client差不多,但是Clinet在多客户端下数据为不一致的,但ServerAndClient在多客户端下则能保持一致
总结,如有问题或理解错误 欢迎指正。
| Any | Client | Downstream | None | Server | ServerAndClient | |
| 第一次请求-状态 | 200 | 200 | 200 | 200 | 200 | 200 |
| IE浏览器回退-状态 | 304 | 304 | 304 | 200 | 200 | 304 |
| IE浏览器A标签跳转回归-状态 | 304 | 304 | 304 | 200 | 200 | 304 |
| F5刷新-状态 | 304 | 200 | 200 | 200 | 200 | 304 |
| 多客户端下情况 | 数据一致 | 数据不一致 | 数据不一致 | 数据不一致 | 数据一致 | 数据一致 |
| 数据存储区域 | 1.客户端 2.代理 3.服务器 |
1.客户端 | 1.任何 HTTP 1.1 可缓存设备 2.代理服务器 3.请求客户端 |
无 | 1.服务端 | 1.服务端 2.客户端 |
作者:释迦苦僧 出处:http://www.cnblogs.com/woxpp/p/3976932.html 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
OutputCache属性详解(二)一 Location的更多相关文章
- OutputCache属性详解(三)— VaryByHeader,VaryByCustom
目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...
- OutputCache属性详解(一)一Duration、VaryByParam
目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...
- OutputCache属性详解(四)— SqlDependency
目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...
- Intent属性详解二 Action、Category
先看效果图: 1.Action:该activity可以执行的动作 该标识用来说明这个activity可以执行哪些动作,所以当隐式intent传递过来action时,如果跟这里<intent-fi ...
- [置顶]
MVC输出缓存(OutputCache参数详解)
1.学习之前你应该知道这些 几乎每个项目都会用到缓存,这是必然的.以前在学校时做的网站基本上的一个标准就是1.搞定增删改查2.页面做的不要太差3.能运行(ps真的有这种情况,答辩验收的时候几个人在讲台 ...
- MVC输出缓存(OutputCache参数详解)
版权声明:本文为博主原创文章,未经博主允许转载随意. https://blog.csdn.net/kebi007/article/details/59199115 1.学习之前你应该知道这些 几乎每个 ...
- Android组件---四大布局的属性详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4372222.html Android常见布局有下面几种: LinearL ...
- Android TextView和EditText属性详解
TextView属性详解: autoLink设置 是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web /email/phone/map/all) ...
- 【CSS3 transform属性和过渡属性详解】
CSS3transform属性详解 transform字面上就是变形,改变的意思. 在CSS3中transform主要包括以下几种:旋转rotate.扭曲skew.缩放scale和移动translat ...
随机推荐
- CentOS6.5修改yum源
在安装完CentOS后一般需要修改yum源,才能够在安装更新rpm包时获得比较理想的速度.国内比较快的有163源.sohu源.这里以163源为例子. 1, cd /etc/yum.repos.d 2. ...
- LightOJ Beginners Problems 部分题解
相关代码请戳 https://coding.net/u/tiny656/p/LightOJ/git 1006 Hex-a-bonacci. 用数组模拟记录结果,注意取模 1008 Fibsieve's ...
- php-redis扩展安装
1 phpredis 在php中访问redis需要安装 https://github.com/phpredis/phpredis 基本上安装上面的readme既可以完成安装,需要注意的是在编译安装的时 ...
- IOS XIB Cell自适应高度实现
1.代码实现Cell高度自适应的方法 通过代码来实现,需要计算每个控件的高度,之后获取一个cell的 总高度,比较常见的是通过lable的文本计算需要的高度. CGSize labelsize = [ ...
- 使用SQL语句逐条更新每条记录
有些时候,我们希望同时更新表中的多条记录,但更新的值不一样. declare @i int declare @j int declare @phone varchar(20) set @j=1 sel ...
- 百度ueditor 实例化 Cannot set property 'innerHTML' of null 完美解决方案
此时此刻,我正在用博客园推荐的TinyMCE编辑器写这个博客,突然想起最近在项目中使用百度ueditor编辑器中的一些经历.所以记录在此,与大家分享. 不得不说,百度ueditor是一款很好的在线编辑 ...
- java 中 finally里面写了return 会发生什么?
boolean test() throws Exception { boolean ret = true; try { int b = 12; int c; for (int i = 1; i > ...
- 常用正则表达式-copy
匹配中文:[\u4e00-\u9fa5] 英文字母:[a-zA-Z] 数字:[0-9] 匹配中文,英文字母和数字及_: ^[\u4e00-\u9fa5_a-zA-Z0-9]+$ 同时判断输入长度:[\ ...
- 解剖SQLSERVER 第七篇 OrcaMDF 特性概述(译)
解剖SQLSERVER 第七篇 OrcaMDF 特性概述(译) http://improve.dk/orcamdf-feature-recap/ 时间过得真快,这已经过了大概四个月了自从我最初介绍我 ...
- TableLayout表格布局详解
一.Tablelayout简介 Tablelayout类以行和列的形式对控件进行管理,每一行为一个TableRow对象,或一个View控件.当为TableRow对象时,可在TableRow下添加子控件 ...