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-SinceLast-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" />

个人感觉DownstreamClinet类似,只不过有两个小区别:

  • 数据存储空间和数据存储模式不一样,后面会总结
  • 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 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

时间: 2024-08-13 15:16:34

OutputCache属性详解一Location的相关文章

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

目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) VaryByHeader :分号分隔的 HTTP 标头列表,用于使输出缓存发生变化.将该特性设为多标头时,对于每个指定标头组合,输出缓存都包含一个不同版本的请求文档. 注意:设置 VaryByHeader 特性将启用在所有 HTTP 1.1 版缓存中缓存项,而不仅仅在 ASP.NET 缓存中进行缓存.用户控件中的 @ OutputCache 指令

OutputCache属性详解(四)— SqlDependency

目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlDependency NoStore bool值,用于决定是否阻止敏感信息的二级存储,默认值为 false. 该属性的测试代码,我没写出来,不知道如何写,各位知道的大侠请说下哈! SqlDependency 标识一组数据库/表名称对的字符串值,页或控件的输出缓存依赖于这些名称对.请注意,SqlCach

css动画-animation各个属性详解(转)

CSS3的animation很容易就能实现各种酷炫的动画,虽然看到别人的成果图会觉得很难,但是如果掌握好各种动画属性,做好酷炫吊炸天的动画都不在话下,好,切入正题. 一.动画属性: 动画属性包括:①animation-name,②animation-duration,③animation-timing-function, 以下是各属性详解: 1.animation-name:指定要绑定到选择器的关键帧的名称. 2.animation-duration:定义动画完成一个周期需要多少秒或毫秒 3.a

jQuery Event.which 属性详解

jQuery Event.which 属性详解 which属性用于返回触发当前事件时按下的键盘按键或鼠标按钮. 对于键盘和鼠标事件,该属性用于确定你按下的是哪一个键盘按键或鼠标按钮. which属性对DOM原生的event.keyCode和event.charCode进行了标准化. 适用的事件类型主要有键盘事件:keypress.keydown.keyup,以及鼠标事件:mouseup.mousedown. 该属性属于jQuery的Event对象(实例). 语法 jQuery 1.1.3 新增该

WPF依赖属性详解

WPF依赖属性详解 WPF 依赖属性 英文译为 Dependency Properties,是WPF引入的一种新类型的属性,在WPF中有着极为广泛的应用,在WPF中对于WPF Dependency Properties 的使用贯穿样式的使用,数据绑定,动画等等,在刚刚接触Dependency Properties的时候可能觉得有些奇怪,但是,当你了解他要解决的问题的时候,你可能就不觉得奇怪了.Dependency Properties第一个要解决的问题就是控件的属性共享问题,由于大部分的WPF控

Hibernate fetch属性详解

主要参考 :http://4045060.blog.51cto.com/4035060/1088025 一.hibernate抓取策略(单端代理的批量抓取fetch=select(默认)/join) 1)保持默认,同fetch="select" <many-to-one name="group" column="group_id" fetch="select" /> 另外发送一条select语句抓取当前对象关联实体

MWPhotoBrowser 属性详解 和代理解释

--------0.MWPhoto简单属性解释---------------- MWPhoto *photo = [MWPhoto photoWithURL:[NSURL URLWithString:@"http://farm4.static.flickr.com/3629/3339128908_7aecabc34b.jpg"]]; photo.caption = @"在将photo添加到数组中时,可以在这里设置标题名字"; photo = [MWPhotophot

Android textAppearance的属性设置及TextView属性详解

textAppearance的属性设置 android:textAppearance="?android:attr/textAppearanceSmall" android:textAppearance="?android:attr/textAppearanceMedium" android:textAppearance="?android:attr/textAppearanceLarge" TextView属性详解 android:autoLi

Shape 各种属性详解

本文来自:http://blog.csdn.net/brokge/article/details/9713041 简介: 作用:XML中定义的几何形状 位置:res/drawable/文件的名称.xml 使用的方法: Java代码中:R.drawable.文件的名称 XML中:Android:background="@drawable/文件的名称" 属性: <shape>形状 Android:shape=["rectangle" | "oval