页面缓存OutputCache

在网页开发中有时候为了提高网页访问速度,有时候我们需要把一些页面放到保存到服务器内存中,当在有请求时,系统将缓存中的相关数据直接输出,直到缓存数据过期。这个过程中,缓存不需要再次经过页面处理生命周期,这样可以缩短请求响应时间,提高应用程序性能。页面输出缓存适用于不需要频繁更新数据,而占用大量时间和资源才能编译生成的页面。对于那些数据经常更新的页面,则不适用。在ASP.NET 中实现页面缓存有可以使用以下两种方式:一种是使用@ OutputCache指令,另一种是使用页面输出缓存API。在这篇文章里我主要记录@ OutputCache的使用方法,这是最简单最实用的一种方法。

一、@ OutputCache指令

指令格式:使用@ OutputCache指令,能够实现对页面输出缓存的一般性需要。@ OutputCache指令在ASP.NET页或者页中包含的用户控件的头部声明。这种方式非常方便,只需几个简单的属性设置,就能够实现页面的输出缓存策略。@ 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" %>

参数说明:(必须属性以用红底白字标出)

 

参数

说明

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”。如果要使输出缓存根据所有参数值发生变化,则将属性设置为“*”。

 

使用举例:

   只要在ASPX页面添加如下代码就可以实现页面缓存:

<%@ OutputCache Duration="200" VaryByParam="none"%>

以上示例是@ OutputCache指令的基本应用,其指示页面输出缓存的有效期是200秒,并且页面不随任何GET或POST参数改变。在该页仍被缓存时接收到的请求由缓存数据提供服务。经过100秒后,将从缓存中移除该页数据,并随后显式处理下一个请求并再次缓存页。我们可以这样做个测试,在页面代码中添加一个输出日期代码如下:

protected void Page_Load(object sender, EventArgs e)

{

            Response.Write(DateTime.Now.ToString());

}

前台不添加任何缓存代码,运行程序前台没刷新一次页面输出的时间会不同,如果我们添加上面的页面缓存代码,在刷新页面看看时间是不会变化的,只有200秒刷新时间才发生了变化,这说明我们的缓存机制已经生效了。

二、清除缓存

页面级缓存是.NET用来提升页面加载速度的一种技术,他将一个网页缓存成HTML的形式保存在服务器端或客户端,需要注意的是,当数据库里面的数据有更新的时候,这个被缓存的HTML是不能发现这样的更新的,他还是会返还原来被缓存的数据,这个时候,你需要手动的清除旧的缓存,让系统自动去生成新的缓存,在.net中可以用HttpResponse.RemoveOutputCacheItem命令来完成清除缓存任务。

 

命令格式:

RemoveOutputCacheItem(path)从缓存中移除与默认输出缓存提供程序关联的所有缓存项。此方法是静态的。

 

参数说明:

path类型:System.String 已从缓存中移除的项的虚拟绝对路径,必须参数不能为空。

 

使用举例:

假设你的default.aspx设定了outputcache你可以通过如下代码:

HttpResponse.RemoveOutputCacheItem("/default.aspx");

清除页面缓存,必须注意这里面的参数就是你页面的绝对路径(不能使用“../”这种相对路径)。

posted on 2013-04-24 15:55  一路笑跑  阅读(822)  评论(0编辑  收藏  举报

导航