网页缓存的分析

来源:互联网 发布:java分词器 编辑:程序博客网 时间:2024/05/17 03:09

         在网上看了几篇关于网页客户端缓存和服务器端缓存的文章,觉得越看越矛盾,越看越迷糊,于是决定自己分析一下。

         我们都知道对于一个网站,如果利用好客户端缓存和服务器缓存会很大的提供网站的性能。那我们先分析一下客户端缓存和服务器缓存是如何工作的。关于网页的缓存有以下几种设置方法:

1.在客户端的浏览器可以设置(IE)

2.在服务器的iis中设置

3.可以在网页的页面中设置或通过代码设定

<meta http-equiv="pragma" content="no-cache">

<%@ OutputCache Duration="3600" Location="Any"VaryByCustom="browser" VaryByParam="RequestID" %>

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetExpires(DateTime.Parse(
"6:00:00PM"));

那这些设置是如何工作的呢?

一,我们首先分析一下静态文件(html.css.img)是如何缓存的

A.设置客户端的浏览器为默认设置:选择“每次访问网页时”选项,服务器iis不勾选启用内容过期

访问一个html页面,在Temporary Internet Files文件夹中查看该html页面的属性如下:

然后再访问此html页面,再查看属性

修改该html页面之后,再访问,查看属性

所做的修改马上在页面呈现了出来。

总结:由上面的分析可以看出,在服务器端不启用内容过期的情况下,第一次访问静态文件时,会读取静态文件的信息并存储在客户端(包括文件的上次修改时间),当第二次访问时,会查看文件是否有更新,如果文件更新了则重新下载文件并存储在客户端,如果没有更新则读取存储在客户端的文件。所以在默认的情况下(客户端浏览器默认设置,服务器不开启内容过期),如果文件没有更新,只有在第一次访问的时候才会从服务器上下载文件,但会每次比较文件是否有更新。如果访问时,在后面加上参数如:Test.html?time=1023,  而且参数每次访问都不一样,这样即使文件没有更新,也会重新从服务器上下载文件。

遇到的疑问:

当多个页面引用同一个js文件时,访问这些页面的时候是否都会重新下载这个js文件呢? 通过上面的分析,是不会的。但是很多博客上都说每次都很下载,我不知道他们是怎么得到那个结论的。

B.我们再来看一下另一种情况,设置客户端的浏览器为默认设置:每次访问网页时,服务器iis勾选启用内容过期。

然后访问html页面,在Temporary Internet Files文件夹中查看该html页面的属性如下:

修改该html后,再次访问

所做的修改没有在页面上呈现了出来,强制刷新页面,修改才呈现出来了。

结论:在服务器端启用内容过期后,在截止期限内,对静态文件的访问都将从客户端读取(不论服务器上的文件有没有修改),除非强制刷新或在地址后面加上参数

c.给html 页面加上缓存控制的代码

<meta http-equiv="pragma" content="no-cache">

在这种情况下,即使在服务器开启内容过期,只要html页面有更新都会重新下载文件。如果没有更新,应该不会重新下载。

 

上面是对静态文件缓存的分析。那对于*.aspx,缓存是如何工作的呢?

经测试在服务器端启用内容过期的情况下,只要对*.aspx进修改,再次访问修改会立即呈现。由此可看内容过期对*.aspx是没有任何效果的。

要对*.aspx文件进行缓存,就要使用页面输出缓存指令OutputCache 或Response.Cache对象,可以指定缓存的时间,位置,参数等。详细说明如下:

使用@ OutputCache指令,能够实现对页面输出缓存的一般性需要。@ OutputCache指令在ASP.NET页或者页中包含的用户控件的头部声明。这种方式非常方便,只需几个简单的属性设置,就能够实现页面的输出缓存 策略。@ OutputCache指令声明代码如下。


@ OutputCache指令代码

<%@ OutputCache CacheProfile =" " NoStore= "True | False" Duration ="#ofseconds" Shared ="True | False" Location ="Any | Client | Downstream | Server | None | ServerandClient " SqlDependency ="database/table name pair | CommandNotification " VaryByControl ="controlname" VaryByCustom ="browser | customstring" VaryByHeader ="headers" VaryByParam ="parametername" %>

如上所示,在@ OutputCache指令中,共包括10个属性,它们是CacheProfile、NoStore、Duration、Shared、 Location、SqlDependency、VaryByControl、VaryByCustom、VaryByHeader和 VaryByParam。这些属性将对缓存时间、缓存项的位置、SQL数据缓存依赖等各方面进行设置。下面简要介绍以上属性的基本概念。

CacheProfile

用于定义与该页关联的缓存设置的名称。是可选属性,默认值为空字符("")。需要注意的是,包含在用户控件中的@ OutputCache指令不支持此属性。在页面中指定此属性时,属性值必须与Web.config文件<outputCacheSettings>配置 节下的outputCacheProfiles元素中的一个可用项的名称匹配。如果此名称与配置文件项不匹配,将引发异常。

NoStore

该属性定义一个布尔值,用于决定是否阻止敏感信息的二级存储。需要注意的是,包含在用户控件中的@ OutputCache指令不支持此属性。将此属性设置为true等效于在请求期间执行代码“Response.Cache.SetNoStore();”。

Duration

用于设置页面或者用户控件缓存的时间。单位是秒。通过设置该属性,能够为来自对象的HTTP响应建立了一个过期策略,并将自动缓存页或用户控件输出。需要注意的是,Duration属性是必需的,否则将会引起分析器错误。

Shared

该属性定义一个布尔值,用于确定用户控件输出是否可以由多个页共享。默认值为false。注意,包含在ASP.NET页中的@ OutputCache指令不支持此属性。

Location

用于指定输出缓存项的位置。其属性值是OutputCacheLocation枚举值,它们是Any、Client、Downstream、None、 Server和ServerAndClient。默认值是Any,表示输出缓存可用于所有请求,包括客户端浏览器、代理服务器或处理请求的服务器上。需要注意的是,包含在用户控件中的@ OutputCache指令不支持此属性。

SqlDependency

该属性标识一组数据库/表名称对的字符串值,页或控件的输出缓存依赖于这些名称对。需要注意:SqlCacheDependency类监视输出缓存所依赖 的数据库中的表,因此,当更新表中的项时,使用基于表的轮询将从缓存中移除这些项。当通知(在SQL Server 2005中)与CommandNotification值一起使用时,最终将使用SqlDependency类向SQL Server 2005服务器注册查询通知。另外,SqlDependency属性的CommandNotification值仅在ASP.NET页中有效。控件只能将 基于表的轮询用于@ OutputCache指令。

VaryByControl

该属性使用一个分号分隔的字符串列表来更改用户控件的输出缓存。这些字符串代表在用户控件中声明的ASP.NET服务器控件的ID属性值。除非已经包含了VaryByParam属性,否则在@ OutputCache指令中,该属性是必需的。

VaryByCustom

用于自定义输出缓存要求的任意文本。如果赋予该属性值是browser,缓存将随浏览器名称和主要版本信息的不同而异。如果输入了自定义字符串,则必须在 应用程序的Global.asax文件中重写HttpApplication.GetVaryByCustomString方法。

VaryByHeader

该属性中包含由分号分隔的HTTP标头列表,用于使输出缓存发生变化。当将该属性设为多标头时,对于每个指定的标头,输出缓存都包含一个请求文档的不同版 本。VaryByHeader属性在所有HTTP 1.1缓存中启用缓存项,而不仅限于ASP.NET缓存。用户控件中的@ OutputCache指令不支持此属性。

VaryByParam

该属性定义了一个分号分隔的字符串列表,用于使输出缓存发生变化。默认情况下,这些字符串与用GET方法属性发送的查询字符串值对应,或与用POST方法 发送的参数对应。当将该属性设置为多参数时,对于每个指定的参数,输出缓存都包含一个请求文档的不同版本。可能的值包括“none”、“*”和任何有效的 查询字符串或POST参数名称。值得注意的是,在输出缓存ASP.NET页时,该属性是必需的。它对于用户控件也是必需的,除非已经在用户控件的@ OutputCache指令中包含了VaryByControl属性。如果没有包含,则会发生分析器错误。如果不需要使缓存内容随任何指定参数发生变化, 则可将该值设为“none”。如果要使输出缓存根据所有参数值发生变化,则将属性设置为“*”。

其实OutputCache指令和Response.Cache对象基本类似。以下是有关 OutputCache 指令和编程代码等效代码示例。 

在指定期间存储输出缓存

声明方法:
<%@ OutputCache Duration="60" VaryByParam="None" %>
编程方法:
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));Response.Cache.SetCacheability(HttpCacheability.Public);


在浏览器客户端发出请求输出缓存存储

声明方法:
<%@ OutputCache Duration="60" Location="Client" VaryByParam="None" %>
编程方法:
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));Response.Cache.SetCacheability(HttpCacheability.Private);


将输出缓存存储在任何 HTTP 1.1 缓存能力设备包括代理服务器和客户端进行请求

声明方法:
<%@ OutputCache Duration="60" Location="Downstream" VaryByParam="None" %>
编程方法:
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
            Response.Cache.SetCacheability(HttpCacheability.Public);
            Response.Cache.SetNoServerCaching();


 将输出缓存存储在 Web 服务器

声明方法:
<%@ OutputCache Duration="60" Location="Server" VaryByParam="None" %>
编程方法:
TimeSpan freshness = new TimeSpan(0,0,0,60);
            DateTime now = DateTime.Now;
            Response.Cache.SetExpires(now.Add(freshness));
            Response.Cache.SetMaxAge(freshness);
            Response.Cache.SetCacheability(HttpCacheability.Server);
            Response.Cache.SetValidUntilExpires(true); 


 要缓存输出为每个 HTTP 请求到达与不同城市:

声明方法:
<%@ OutputCache duration="60" varybyparam="City" %>
编程方法:
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));Response.Cache.SetCacheability(HttpCacheability.Public);Response.Cache.VaryByParams["City"] = true;对于 VaryByCustom 属性、 VaryByHeader 属性和 OutputCache 指令, 中 < A0 > VaryByParam < / A0 > 属性 HttpCachePolicy 类提供 VaryByHeaders 属性和 VaryByParams 属性和 SetVaryByCustom 方法。

 

如果有不对的地方和不同意见,希望能指出