目录

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 对于浏览器操作的访问大家可以看下

关于Pragma:no-cache,跟Cache-Control: no-cache相同。Pragma: no-cache兼容http 1.0 ,Cache-Control: no-cache是http 1.1提供的。因此,Pragma: no-cache可以应用到http 1.0 和http 1.1,而Cache-Control: no-cache只能应用于http 1.1.

在多个客户端请求时,页面所展示的信息不会一致。

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的更多相关文章

  1. OutputCache属性详解(三)— VaryByHeader,VaryByCustom

    目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...

  2. OutputCache属性详解(一)一Duration、VaryByParam

    目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...

  3. OutputCache属性详解(四)— SqlDependency

    目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...

  4. Intent属性详解二 Action、Category

    先看效果图: 1.Action:该activity可以执行的动作 该标识用来说明这个activity可以执行哪些动作,所以当隐式intent传递过来action时,如果跟这里<intent-fi ...

  5. [置顶] MVC输出缓存(OutputCache参数详解)

    1.学习之前你应该知道这些 几乎每个项目都会用到缓存,这是必然的.以前在学校时做的网站基本上的一个标准就是1.搞定增删改查2.页面做的不要太差3.能运行(ps真的有这种情况,答辩验收的时候几个人在讲台 ...

  6. MVC输出缓存(OutputCache参数详解)

    版权声明:本文为博主原创文章,未经博主允许转载随意. https://blog.csdn.net/kebi007/article/details/59199115 1.学习之前你应该知道这些 几乎每个 ...

  7. Android组件---四大布局的属性详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4372222.html Android常见布局有下面几种: LinearL ...

  8. Android TextView和EditText属性详解

    TextView属性详解: autoLink设置 是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web /email/phone/map/all) ...

  9. 【CSS3 transform属性和过渡属性详解】

    CSS3transform属性详解 transform字面上就是变形,改变的意思. 在CSS3中transform主要包括以下几种:旋转rotate.扭曲skew.缩放scale和移动translat ...

随机推荐

  1. 解决EasyUI动态添加标签渲染问题

    以下代码用于Js脚本中: var Work_Content_Back = "<table width='99%' class='table' style='margin-bottom: ...

  2. js读写Cookie问题(Cookie存储时长、Cookie存储域)汇总

    在采集网站用户行为数据/使用js对用户行为做交互时,经常会使用到Cookie,了解Js Cookie的读写,以及一些细节,非常重要.   什么是Cookie 所谓Cookie,只是一条极为短小的信息, ...

  3. HtmlAgilityPack组件

    HtmlAgilityPack组件用于解析Html字符串,一个典型的应用场景是用于网页爬虫. 示例程序 using Common.Tools; using Datebase.Entity; using ...

  4. 利用yum下载软件包的三种方法

    转自:http://297020555.blog.51cto.com/1396304/530703 方法一: downloadonly插件 有一个yum的插件叫做downloadonly,顾名思义,就 ...

  5. 转载扩展Windows Mobile模拟器存储空间的方法

    扩展Windows Mobile模拟器存储空间的方法 在Windows Mobile应用程序开发的初期,可以使用SDK自带的模拟器来进行调试,这给我们开发人员提供了一种方便的途径.一般的应用程序,占用 ...

  6. Software Testing hw1

    I still remember the error which I made in my java project last year. I spent a whole night solving  ...

  7. Java学习笔记(五)

    作业1:将指定目录下的所有文件显示到列表框(JList)组件中. 代码如下: import java.awt.; import java.awt.event.; import javax.swing. ...

  8. IO-03. 求整数均值(10)

    本题要求编写程序,计算4个整数的和与平均值.题目保证输入与输出均在整型范围内. 输入格式: 输入在一行中给出4个整数,其间以空格分隔. 输出格式: 在一行中按照格式“Sum = 和; Average ...

  9. zabbix3.x搭建(1)

    服务器端安装配置: 1).安装: yum -y install gcc gcc-c++ autoconf httpd php mysql mysql-server php-mysql httpd-ma ...

  10. PPC MPC85xx e500学习笔记

    powerpc的内存体系结构 E500内核中包含内存管理单元MMU,其包含两个查找表(TLB0 Transaction Lookside Buffer)和TLB1来实现虚拟地址和物理地址的转化,其中T ...