15.2 整页输出缓存
知识点讲解:光盘:视频\PPT讲解(知识点)\第15章\整页输出缓存.mp4
设置页面输出缓存可以使用以下2种方式。
- 使用@ OutputCache指令。
- 使用API缓存。
其中,@ OutputCache指令在ASP.NET 1.x中出现过,并在ASP.NET 2.0中得到了继承和增强。API缓存主要是指HttpCachePolicy类。
15.2.1 使用@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"
%>
在上述@ OutputCache指令中,包含了10个属性,通过这些属性对缓存的时间、缓存项的位置、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.GetVaryByCustom String方法。
- VaryByHeader:该属性中包含由分号分隔的HTTP标头列表,用于使输出缓存发生变化。当将该属性设为多标头时,对于每个指定的标头,输出缓存都包含一个请求文档的不同版本。VaryByHeader属性在所有HTTP 1.1缓存中启用缓存项,而不仅限于ASP.NET缓存。用户控件中的@ OutputCache指令不支持此属性。
- VaryByParam:此属性定义了一个分号分隔的字符串列表,用于使输出缓存发生变化。默认情况下,这些字符串与用GET方法发送的查询字符串值对应,或与用POST方法发送的参数对应。当将该属性设置为多参数时,对于每个指定的参数,输出缓存都包含一个请求文档的不同版本。可能的值包括“none”“*”和任何有效的查询字符串或POST参数名称。值得注意的是,在输出缓存ASP.NET页时,该属性是必需的。它对于用户控件也是必需的,除非已经在用户控件的@ OutputCache指令中包含了VaryByControl属性。如果没有包含,则会发生分析器错误。如果不需要使缓存内容随任何指定参数发生变化,则可将该属性设为“none”;如果要使输出缓存根据所有参数值发生变化,则将该属性设置为“*”。
实例071 定义一个缓存页显示当前的时间
源码路径 光盘\daima\15\Web\ 视频路径 光盘\视频\实例\第15章\071
本实例的实现文件是OutputCache.aspx,其主要代码如下。
<%@ Page Language="C#|" %>
<%@ OutputCache Duration="60" VaryByParam="none" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
TimeMsg.Text = DateTime.Now.ToString();
}
</script>
<html>
<body>
<h3>
<font face="Verdana">使用缓存</font>
</h3>
<p>
<i>发生时间:</i>
<asp:Label ID="TimeMsg" runat="server" />
</p>
</body>
</html>
范例141:通过鼠标滑轮控制图片大小
源码路径:光盘\演练范例\141
视频路径:光盘\演练范例\141
范例142:显示随机图像
源码路径:光盘\演练范例\142
视频路径:光盘\演练范例\142
在上述代码中,通过<%@ OutputCache Duration="60" VaryByParam="none" %>定义页面OutputCache.aspx被缓存处理,并设置了缓存时间为60秒;通过定义VaryByParam属性,设置不会因为Request接收的返回参数而改变。代码执行后,TimeMsg标签将显示当前的系统时间,如图15-1所示。因为使用了缓存机制,所以在60秒内刷新此页面后,都会显示这个时间,如图15-2所示。
图15-1 初始时间
图15-2 60秒内刷新时间
在上述实例中,使用@OutputCache指令设置了当前页面的缓存处理机制。其实除了上述处理机制外,还有另外2种缓存处理方法。
- 硬盘Output Cache
在一般情况下,Output Cache会被缓存到硬盘上。可以通过修改diskcacheenable的属性来设置其是否缓存,还可以通过在web config里配置缓存文件的大小。以上述实例代码为例,具体配置方法如下。
(1)配置web config文件代码,设置其缓存代码如下。
<caching>
<outputCache>
<diskCache enabled="true" maxSizePerApp="2" />
</outputCache>
</caching>
(2)设置显示文件代码,在此需要修改文件头,具体代码如下。
<%@ OutputCache Duration="3600" VaryByParam="name" DiskCacheable="true" %>
- 参数缓存
有些时候需要根据用户的请求生成页面,但是用户的请求只有有限的几种组合,此时就可以根据用户请求生成几种缓存页面来进行缓存。此时页面头代码如下。
<%@ Output Cache Duration="60" VaryByParam="state"%>
15.2.2 使用API缓存
使用@ OutputCache指令可以对输出缓存的各项进行设置,此方法简单易行,深得开发人员青睐。并且还继承和扩展了一种使用输出缓存API实现页面输出缓存的方法。该方法的核心是调用System.Web.HttpCachePolicy类。该类主要包含用于设置缓存特定的HTTP标头的方法和用于控制ASP.NET页面输出缓存的方法。.NET Framework 中的HttpCachePolicy类得到了扩充和发展,主要是增加了一些重要方法,例如,SetOmitVarStar方法等。HttpCachePolicy类的方法众多,下面仅简要介绍一些常用方法。
- SetExpires方法
该方法用于设置缓存过期的绝对时间。它的参数是一个DataTime类的实例,表示过期的绝对时间。
- SetLastModified方法
该方法用于设置页面的Last-Modified HTTP标头。Last-Modified HTTP标头表示页面上次修改时间,缓存将依靠它来进行计时。如果违反了缓存限制层次结构,此方法将失败。该方法的参数是一个DataTime类的实例。
- SetSlidingExpiration方法
该方法将缓存过期从绝对时间设置为可调时间。其参数是一个布尔值。当参数为True时,Cache-Control HTTP标头将随每个响应而更新。此过期模式与相对于当前时间将过期标头添加到所有输出集的IIS配置选项相同。当参数为False时,将保留该设置,并且任何启用可调整过期的尝试都将静态失败。此方法不直接映射到HTTP标头,它由后续模块或辅助请求来设置源服务器缓存策略。
- SetOmitVaryStar方法
该方法用于指定在按参数进行区分时,响应是否应该包含vary:*标头。此方法的参数是一个布尔值,若要指示HttpCachePolicy不对其VaryByHeaders属性使用*值,则为True;否则为False。
- SetCacheability方法
该方法用于设置页面的Cache-Control HTTP标头。该标头用于控制在网络上缓存文档的方式。该方法有两种重载方式。一种重载方式的参数是HttpCacheability枚举值,包括NoCache、Private、Public、Server、ServerAndNoCache和ServerAndPrivate(有关这些枚举值的定义,可参考MSDN)。另一种重载方式的参数有两个:一个是HttpCacheability枚举值;另一个是字符串,表示添加到标头的缓存控制扩展。需要注意的是,仅当与Private或NoCache指令一起使用时,字段扩展名才有效。如果组合不兼容指令和扩展,则此方法将引发无效参数异常。
例如下面的代码。
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetExpires(DateTime.Parse("6:00:00PM"));
在上述代码中,Response类的Cache属性用于获取页面缓存策略。该属性的数据类型是HttpCachePolicy。可通过调用Response.Cache来获取HttpCachePolicy实例,进而实现对当前页面输出缓存的设置。如上代码所示,第一行代码表示输出缓存时间是60秒,并且页面不随任何GET或POST参数而改变,等同于“<%@ OutputCache Duration="60" VaryByParam="none" %>”。第二行代码设置缓存过期的绝对时间是当日下午6时整。
再看下面的代码。
<%@ Page Language="C#|" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheablity(HttpCacheablity.Publish);
TimeMsg.Text = DateTime.Now.ToString();
}
</script>
<html>
<body>
<h3>
<font face="Verdana">
Using the API Output Cache
</font>
</h3>
<p>
<i>最后发生于:</i>
<asp:Label ID="TimeMsg" runat="server" />
</p>
</body>
</html>
在上述代码中,通过代码。
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheablity(HttpCacheablity.Publish);
实现了和如下代码一样的缓存功能。
<%@ OutputCache Duration="60" VaryByParam="none" %>
15.2.3 页面输出缓存应用
经过前面2节的学习,我们对使用@ OutputCache指令和API缓存设置页面输出缓存功能的方法有了大致了解。实际上这两种方法各有优点,使用@ OutputCache指令方法比较简洁,但灵活性较差。使用API方法,能够在运行时动态地修改缓存配置,处理更多的复杂需求。本节将利用这两种方法,共同实现一个简单的页面输出缓存应用的示例,介绍页面输出缓存的基本实现方法。
实例072 用@ OutputCache和API输出页面缓存
源码路径 光盘\daima\15\Web 视频路径 光盘\视频\实例\第15章\072
本实例的实现文件是huancun.aspx,具体实现代码如下。
<%@ Page Language="C#|" %>
<%@ OutputCache Duration="60" VaryByParam="state" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
Response.Cache.SetCacheability(HttpCacheability.Server);
string temp_state = Request.QueryString["state"];
if (temp_state == null)
{
Response.Cache.SetNoServerCaching();
TimeMsg.Text = "停止缓存的时间:" + DateTime.Now.ToString();
}
else
{
TimeMsg.Text = "开始缓存的时间:" + DateTime.Now.ToString();
}
}
</script>
<html>
<body>
<h3>
<font face="Verdana">使用缓存</font>
</h3>
<p>
<asp:Label ID="TimeMsg" runat="server" />
</p>
<a href="?state=CA">缓存时间</a><br />
</body>
</html>
范例143:获取图像的实际尺寸
源码路径:光盘\演练范例\143
视频路径:光盘\演练范例\143
范例144:页面插入Flash动画
源码路径:光盘\演练范例\144
视频路径:光盘\演练范例\144
上述代码执行后,初始显示的是停止执行缓存的时间,如图15-3所示;当用户刷新页面时,时间值将随时变化,以便显示当前的最新时间,如图15-4所示;单击“缓存时间”超链接后,页面显示的时间被缓存,数据过期时间为60秒。
图15-3 显示效果
图15-4 显示最新时间
共有条评论 网友评论