有时缓存整个页面是不现实的,因为页的某些部分可能在每次请求时都需要变化。在这些情况下,只能缓存页的一部分。顾名思义,页面部分缓存是将页面部分内容保存在内存中以便响应用户请求,而页面其他部分内容则为动态内容。页面部分缓存的实现包括两种方式:
控件缓存(通过使用控件嵌套的方式来实现缓存部分页面) 。
替换后缓存(通过缓存整个页面,替换部分页面组件的方式来实现部分缓存)。
1. 控件缓存(也称为片段缓存):
这种方式允许将需要缓存的信息包含在一个用户控件内,然后,将该用户控件标记为可缓存的,以此来缓存页面输出的部分内容。该选项允许缓存页面中的特定内容,而没有缓存整个页面,因此,每次都需重新创建整个页。例如,如果要创建一个显示大量动态内容(如股票信息)的页,其中有些部分为静态内容(如每周总结),这时可以将静态部分放在用户控件中,并允许缓存这些内容。
在ASP.NET中,提供了UserControl这种用户控件的功能。一个页面可以通过多个UserControl来组成。只需要在某个或某几个UserControl里设置缓存。
例如:
那么可以在WebUserControl1.ascx的页头代码中添加声明语句:
<%@
Control Language="C#" AutoEventWireup="true"
CodeBehind="WebUserControl1.ascx.cs"
Inherits="CacheWebApp._16_4_5.WebUserControl1" %>
<%@ OutputCache Duration="60" VaryByParam="none" %>
<%=DateTime.Now %>
调用该控件的页面WebForm1.aspx代码:
<%@ Page Language="C#"
AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs"
Inherits="CacheWebApp._16_4_5.WebForm1" %>
<%@ Register
src="WebUserControl1.ascx" tagname="WebUserControl1" tagprefix="uc1"
%>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head
runat="server">
<title>控件缓存</title>
</head>
<body>
<form
/>
</div>
</form>
</body>
</html>
这时候刷新WebForm1.aspx页面时,页面的时间每次刷新都变化,而用户控件中的时间数据却是60秒才变化一次,说明对页面的“局部”控件实现了缓存,而整个页面不受影响。
-------------------------------------------------------------------------------------------------------
2. 缓存后替换:
与控件缓存正好相反。它对整个页面进行缓存,但是页中的某些片段是动态的,因此不会缓存这些片段。ASP.NET页面中既包含静态内容,又包含基于数据库数据的动态内容。静态内容通常不会发生变化。因此,对静态内容实现数据缓存是非常必要的。然而,那些基于数据的动态内容,则不同。数据库中的数据可能每时每刻都发生变化,因此,如果对动态内容也实现缓存,可能造成数据不能及时更新的问题。对此问题如果使用前文所述的控件缓存方法,显然不切实际,而且实现起来很繁琐,易于发生错误。
如何实现缓存页面的大部分内容,而不缓存页面中的局部某些片段。ASP.NET
2.0提供了缓存后替换功能。实现该项功能可通过以下三种方法:
一是以声明方式使用Substitution控件,
二是以编程方式使用Substitution控件API,
三是以隐式方式使用控件。
前两种方法的核心是Substitution控件,本节将重点介绍该控件,第三种方法仅专注于控件内置支持的缓存后替换功能,本节仅做简要说明。
(1)
Substitution控件应用
为提高应用程序性能,可能会缓存整个ASP.NET页面,同时,可能需要根据每个请求来更新页面上特定的部分。例如,可能要缓存页面的很大一部分,需要动态更新该页上与时间或者用户高度相关的信息。在这种情况下,推荐使用Substitution控件。Substitution控件能够指定页面输出缓存中需要以动态内容替换该控件的部分,即允许对整页面进行输出缓存,然后,使用Substitution控件指定页中免于缓存的部分。需要缓存的区域只执行一次,然后从缓存读取,直至该缓存项到期或被清除。动态区域,也就是Substitution控件指定的部分,在每次请求页面时都执行。Substitution控件提供了一种缓存部分页面的简化解决方案。
<%@
Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs"
Inherits="CacheWebApp._16_4_5.WebForm2" %>
<%@ OutputCache
Duration="60" VaryByParam="none" %>
<html
xmlns="http://www.w3.org/1999/xhtml" >
<head
runat="server">
<title>缓存后替换示例</title>
</head>
<body>
<form
;
PlaceHolder1.Controls.Add(Substitution1);
Label1.Text=DateTime.Now.ToString();
}
public
static string GetCurrentDateTime(HttpContext context)
{
return
DateTime.Now.ToString();
}
如上代码所示,页面使用@
OutputCache指令设置了输出缓存功能,其配置数据缓存过期时间为60秒。然而,页面其他内容都被缓存,通过Substitution调用的回调方法显示的内容是不被缓存的。
引用地址:http://hi.baidu.com/jiangyangw3r/item/e2cad6d0a9eb2ee6b2f77769