分享
 
 
 

ASP.NET 2.0的页面缓存功能介绍

王朝asp·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

页面部分缓存是指输出缓存页面的某些部分,而不是缓存整个页面内容。实现页面部分缓存有两种机制:一种是将页面中需要缓存的部分置于用户控件(.ascx文件)中,并且为用户控件设置缓存功能(包含用户控件的ASP.NET页面可设置也可不设置缓存)。这就是通常所说的“控件缓存”。设置控件缓存的实质是对用户控件进行缓存配置。主要包括以下3种方法:一是使用@ OutputCache指令以声明方式为用户控件设置缓存功能,二是在代码隐藏文件中使用PartialCachingAttribute类设置用户控件缓存;三是使用ControlCachePolicy类以编程方式指定用户控件缓存设置。另外,还有一种称为“缓存后替换”的方法。该方法与控件缓存正好相反,将页面中的某一部分设置为不缓存,因此,尽管缓存了整个页面,但是当再次请求该页时,将重新处理那些没有设置为缓存的内容。

使用@ OutputCache指令

控件缓存与页面输出缓存的@ OutputCache指令既有相似之处,又有不同的方面。二者的共同点在于它们的设置方法基本相同,都是文件顶部设置包含属性的@ OutputCache指令字符串。不同点包括以下两个方面:一是控件缓存的@ OutputCache指令设置在用户控件文件中,而页面输出缓存的@ OutputCache设置在普通ASP.NET文件中。二是控件缓存的@ OutputCache指令只能设置6个属性,Duration、Shared、SqlDependency、VaryByControl、VaryByCustom和VaryByParam。而在页面输出缓存的@ OutputCache指令字符串中设置的属性多达10个。以上是设置控件缓存时需要注意的问题。下面列举了一些利用@ OutputCache指令设置控件缓存的示例,其中重点说明了VaryByParam和VaryByControl等属性应用。

用户控件中的@ OutputCache指令设置源代码

<%@ OutputCache Duration="120" VaryByParam="CategoryID;SelectedID"%>

以上代码设置用户控件缓存有效期时间是120秒,并且允许使用CategoryID和SelectedID参数来改变缓存。通过VaryByParam属性设置,在服务器缓存中可能存储多个用户控件的实例。例如,对于一个包含用户控件的页面,可能存在如下的URL链接。

包含用户控件的页面的URL链接

http://localhost/mypage.aspx?categoryid=foo&selectedid=0

http://localhost/mypage.aspx?categoryid=foo&selectedid=1

当请求如上URL地址的页面时,由于控件中@ OutputCache指令的设置,尤其是属性VaryByParam的设置,那么在服务器缓存中就会存储两个版本的用户控件缓存实例。

控件缓存设置除了支持以上所述VaryByParam属性外,还支持VaryByControl属性。VaryByParam属性基于使用POST或者GET方式发送的名称/值对来改变缓存,而VaryByControl属性通过用户控件文件中包含的服务器控件来改变缓存。下面是VaryByControl属性的应用示例代码。

用户控件中的@ OutputCache指令设置源代码

<%@ OutputCache Duration="120" VaryByParam="none" VaryByControl="Category" %>

以上代码设置缓存有效期是120秒,并且页面不随任何GET或POST参数改变(即使不使用VaryByParam属性,但是仍然需要在@ OutputControl指令中显式声明该属性)。如果用户控件中包含ID属性为“Category”的服务器控件(例如下拉框控件),那么缓存将根据该控件的变化来存储用户控件数据。

如果读者已经掌握了页面输出缓存的@ OutputCache指令设置方法,那么控件缓存的@ OutputCache指令也会迎刃而解,无非仅使用其中的6个属性而已。然而,可能会产生疑问:如果ASP.NET页面和其中包含的用户控件都通过@ OutputCache指令设置了缓存,那么缓存该如何运行呢?

遇到这个问题时,应掌握以下个基本原则:一是ASP.NET允许在页面和页面的用户控件中同时使用@ OutputCache指令设置缓存,并且允许设置不同的缓存过期时间值。二是如果页面输出缓存过期时间长于用户控件输出缓存过期时间,则页面的输出缓存持续时间优先。例如,如果页面输出缓存设置为100秒,而用户控件的输出缓存设置为50秒,则包括用户控件在内的整个页将在输出缓存中存储100秒,而与用户控件较短的时间设置无关。三是如果页面输出缓存过期时间比用户控件的输出缓存过期时间短,则即使已为某个请求重新生成该页面的其余部分,也将一直缓存用户控件直到其过期时间到期为止。例如,如果页面输出缓存设置为50秒,而用户控件输出缓存设置为100秒,则页面其余部分每到期两次,用户控件才到期一次。

使用PartialCachingAttribute类

使用PartialCachingAttribute类可在用户控件的代码隐藏文件中设置有关控件缓存的配置内容。此处应重点了解PartialCachingAttribute类的6个常用属性和4种类构造函数。6个常用属性是Duration、Shared、SqlDependency、VaryByControl、VaryByCustom和VaryByParam。这与上文所示的控件缓存@ OutputCache指令设置的6个属性完全相同,只是所使用的方式不同。在此不对这6个属性重复介绍。下面重点说明PartialCachingAttribute类的4种构造函数,这对于使用该类有着重要意义。

[PartialCaching(int duration)]

这是最为常用的一种格式。其参数duration为整数类型,用于设置用户控件缓存有效期时间值。该参数与@ OutputCache指令中的Duration属性对应。

[PartialCaching(int duration, string varyByParams, string varyByControls, string varyByCustom)]

这种格式设置的内容较多。参数duration与上面说明的相同。参数varyByParams是一个由分号分隔的字符串列表,用于使输出缓存发生变化。该参数与@ OutputCache指令中的VaryByParam属性对应。参数varyByControls是一个由分号分隔的字符串列表,用于使输出缓存发生变化,其与@ OutputCache指令中的VaryByControl属性对应。参数varyByCustom用于设置任何表示自定义输出缓存要求的文本,与@ OutputCache指令中的VaryByCustom属性对应。

[PartialCaching(int duration, string varyByParams, string varyByControls, string varyByCustom, bool shared)]

这种格式中,参数duration、varyByParams、varyByControls、varyByCustom都与上面说明的参数相同。只有参数shared是新添加的。参数shared值是一个布尔值,用于确定用户控件输出缓存是否可以由多个页面共享。默认值为false。当该参数设置为true,表示用户控件输出缓存可以被多个页面共享,可以潜在节省大量内存。

[PartialCaching(int duration, string varyByParams, string varyByControls, string varyByCustom, string sqlDependency, bool shared)]

以上格式中添加了一个新参数sqlDependency。用于设置用户控件缓存入口所使用SQL Server缓存依赖功能的数据库及表名。如果包含多个数据库及表名,则使用分号(;)分隔开来。当该属性值发生变化时,缓存入口将过期。另外,数据库名必须与web.config文件中的<sqlcachedependency>配置节的内容匹配。

以上介绍了PartialCachingAttribute类的6个属性和4种构造函数。下面通过一个典型示例说明该类的具体应用方法。例如,使用PartialCachingAttribute类设置用户控件(NewUserControl.ascx文件)的缓存有效期时间是20秒,其代码如下所示。

使用PartialCachingAttribute类实现设置用户控件缓存

[PartialCaching(20)]

public partial class NewUserControl : UserControl

{......}

以上代码会存储在NewUserControl.ascx.cs文件中。NewUserControl是用户控件类,继承自UserControl基类。当使用PartialCachingAttribute类设置该用户控件缓存时,必须在控件类声明前设置“[PartialCaching(......)]”。该代码段可详细设置用户控件的缓存功能。例如,以上代码设置了缓存有效时间为20秒。这与在NewUserControl.ascx文件顶部设置指令的Duration属性值为20是一致的。

由于用户控件应用了PartialCachingAttribute类(或者包含@ OutputCache指令),则ASP.NET分析器将生成PartialCachingControl类的实例来包装该用户控件。需要注意的是,此时生成PartialCachingControl类实例还有一个必要条件,即必须通过使用TemplateControl.LoadControl方法动态加载用户控件,并且,将用户控件插入页面的控件层次结构中,这样才会生成PartialCachingControl类实例。在通常情况下是不能直接使用PartialCachingControl类的。生成PartialCachingControl类实例能够在运行时,获取对用户控件缓存设置的更大灵活性。

使用ControlCachePolicy类

ControlCachePolicy是.NET Framework 2.0中新出现的类,主要用于提供对用户控件的输出缓存设置的编程访问。ControlCachePolicy类与前文说明的HttpCachePolicy类有些类似。只是二者所访问的对象不同。HttpCachePolicy类用于访问页面输出缓存,而ControlCachePolicy类用于访问用户缓存。

使用ControlCachePolicy类有以下注意事项。

一是如果要创建正确有效的ControlCachePolicy类实例以便设置控件缓存,那么必须访问PartialCachingControl类的BasePartialCachingControl.CachePolicy属性(BasePartialCachingControl是PartialCachingControl类的基类)。在这个过程中,需要调用LoadControl方法,实现动态加载用户控件,这样才能获得为PartialCachingControl类包装的用户控件实例,进而利用其CachePolicy属性获取ControlCachePolicy实例。如果直接访问用户控件的UserControl.CachePolicy属性,则只能在该用户控件已由BasePartialCachingControl控件包装的情况下,才能获取有效的ControlCachePolicy实例。如果用户控件未进行包装,那么尝试通过CachePolicy属性获取ControlCachePolicy实例将引发异常,因为它不具有关联的BasePartialCachingControl。若要确定用户控件实例是否支持缓存(而不生成异常),可检查SupportsCaching属性。

二是ControlCachePolicy实例仅在控件生命周期的Init和PreRender阶段之间,才能成功操作。如果在PreRender阶段后修改ControlCachePolicy对象,则ASP.NET会引发异常,因为呈现控件后所进行的任何更改,都无法影响缓存设置(控件在Render阶段缓存)。以上内容说明最好在Page_Init事件处理程序中,创建并操作ControlCachePolicy实例。

下面首先讲解ControlCachePolicy类的6个属性,它们是Cached、Dependency、Duration、SupportsCaching、VaryByControl和VaryByParams。

Cached属性

用于获取或者设置一个布尔值,表示是否在用户控件中启用控件缓存功能。true表示启用控件缓存功能,否则为false。

Dependency属性

用于获取或者设置一个CacheDependency实例对象,该对象与用户控件的输出缓存关联。默认值为null。当CacheDependency实例对象失效时,用户控件的输出缓存将从缓存中移除。

Duration属性

获取或者设置一个TimeSpan结构,表示用户控件输出缓存的有效时间。默认值为Zero。

SupportsCaching属性

该属性获取一个布尔值,用于表示用户控件是否支持缓存功能。如果属性值为true,则表示该用户控件支持缓存;否则为false。

VaryByControl属性

用于获取或者设置一个由分号分隔的字符串列表,这些字符串包含在用户控件中声明的服务器控件ID属性值。可根据该属性值,使输出缓存发生变化。

VaryByParams属性

用于获取或者设置一个由分号分隔的字符串列表。默认情况下,这些字符串与用GET方法属性发送的查询字符串值对应,或与用POST方法发送的参数对应。用户控件可根据该属性值,使输出缓存发生变化。

另外,ControlCachePolicy类还包括3个常用方法,SetExpires、SetSlidingExpiration和SetVaryByCustom。

public void SetExpires(DateTime expirationTime);

指示用户控件输出缓存入口在特定的时间内过期。可使用和参数设置为的SetSlidingExpiration方法指示用户控件输出缓存使用可调过期策略。如果SetSlidingExpiration方法的参数设置为false,则用户控件输出缓存使用绝对过期策略。

public void SetSlidingExpiration(bool useSlidingExpiration);

指示用户控件缓存入口使用Sliding过期策略,或者Absolute过期策略。当参数useSlidingExpiration设置为true时,则用户控件输出缓存使用Sliding过期策略。否则,使用Absolute过期策略。

public void SetVaryByCustom(string varyByCustom);

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

下面介绍一个典型示例,动态设置用户控件缓存过期时间为30秒,并且使用绝对过期策略。用户控件代码隐藏文件源代码如下。

使用PartialCachingAttribute类实现设置用户控件缓存(用

[1] [2] [3] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有