页面部分缓存
页面部分缓存的实现方式有2种:缓存用户控件和实现缓存后替换。下面就这二种方法作详细的介绍。
缓存用户控件
可以通过三种方式来实现:使用@OutputCache指令声明的方式、在代码隐藏文件中使用PartialCachingAttribute类设置用户控件缓存、使用ControlCachePolicy类以编程方式。
使用@OutputCache指令
需要注意的是用户控件的@OutputCache指令只有6个属性,Duration、Shared、SqlDependency、VaryByControl、VaryByCustom和VaryByParam。例如: <%@ OutputCache Duration="60" VaryByParam="State" %>,当用户在访问URL链接(http://localhost/Default.aspx?State=ca http://localhost/Default.aspx?State=us )的时候,就会缓存用户控件的2个不同版本。同样,还可以设置VaryByControl属性,例如<%@ OutputCache Duration="60" VaryByControl="State" %>,State指用户控件中ID为“State”的服务器控件,缓存将根据该控件的变化来存储用户控件数据。
使用PartialCachingAttribute类
示例代码:
[PartialCaching(60)]
public partial class NewUserControl :UserControl
{......}
以上代码表示缓存的有效期是60秒,这与在用户控件页面头部声明<%@ OutputCache Duration="60" VaryByParam=none %>的效果是一致的。需要注意的是,以这种方式缓存用户控件还有一个必要条件,必须使用TemplateControl.LoadControl方法动态加载用户控件,将用户控件插入页面的控件层次结构中才能生效。
PartialCachingAttribute 构造函数
使用ControlCachePolicy类
ControlCachePolicy是 .NET Framework 2.0 版中是新增的类,提供对 ASP.NET 用户控件的输出缓存设置的编程访问。HttpCachePolicy类用于访问页面输出缓存,而ControlCachePolicy类用于访问用户控件的输出缓存。
使用 ControlCachePolicy 类是可用于启用输出缓存的几种方法之一。下表介绍可用来启用输出缓存的方法:
在声明性方案中使用 @ OutputCache 指令来启用输出缓存。
在代码隐藏文件中使用 PartialCachingAttribute 属性为用户控件启用缓存。
使用 ControlCachePolicy 类在使用 BasePartialCachingControl 实例的编程方案中指定缓存设置,该实例已使用上述方法之一启用了缓存并已使用 System.Web.UI.TemplateControl.LoadControl 方法动态加载。ControlCachePolicy 实例仅在控件生命周期的 Init 和 PreRender 阶段之间才能成功操作。如果在 PreRender 阶段后修改 ControlCachePolicy 对象,则 ASP.NET 会引发异常,因为呈现控件后所进行的任何更改实际上都无法影响缓存设置(控件在 Render 阶段缓存)。最后,在实际呈现后,只能使用编程方式对用户控件实例(及其 ControlCachePolicy 对象)进行操作。
ControlCachePolicy 属性
示例:下面的代码示例演示如何在运行时动态加载用户控件,以及如何以编程方式操作用户控件。PartialCachingAttribute 属性应用于一个名为 SimpleControl 的用户控件,这意味着该用户控件在运行时由 PartialCachingControl 控件包装。SimpleControl 对象的缓存设置可以通过其关联的 ControlCachePolicy 对象以编程方式进行操作,通过引用包装该对象的 PartialCachingControl 控件可获得该对象。在此示例中,在页初始化期间检查 Duration 属性并在满足某些条件的前提下使用 SetSlidingExpiration 和 SetExpires 方法更改该属性。
实现缓存后替换
有三种方法可以实现缓存后替换:以声明方式使用 Substitution 控件。以编程方式使用 Substitution 控件 API。以隐式方式使用 AdRotator 控件。
Substitution 控件
ASP.NET Substitution 控件指定缓存页中动态创建而不进行缓存的部分。将 Substitution 控件放置在该页上要显示动态内容的位置。
在运行时,Substitution 控件调用使用 MethodName 属性指定的方法。该方法必须返回一个字符串,然后该字符串替换 Substitution 控件的内容。该方法必须是 Page 或 UserControl 包含控件上的静态方法。
使用 Substitution 控件可以将客户端可缓存性更改为服务器可缓存性,以便该页面不会在客户端上进行缓存。这样可以确保以后对该页的请求能够再次调用该方法以生成动态内容。
Substitution API
若要以编程方式为缓存页创建动态内容,可以在页代码中将某个方法的名称作为参数传递给 WriteSubstitution 方法来调用该方法。该方法处理动态内容的创建,它采用单个 HttpContext 参数并返回一个字符串。该返回字符串是将在给定位置被替换的内容。通过调用 WriteSubstitution 方法来代替以声明方式使用 Substitution 控件的一个好处是可以调用任意对象的方法,而不只是调用 Page 或 UserControl 对象的静态方法。
调用 WriteSubstitution 方法可以将客户端可缓存性更改为服务器可缓存性,以便该页不会在客户端上进行缓存。这样可以确保以后对该页的请求能够再次调用该方法以生成动态内容。
AdRotator 控件
AdRotator 服务器控件在内部实现对缓存后替换的支持。如果将 AdRotator 控件放在页面上,则无论是否缓存父页,都将在每次请求时呈现其特有的广告。因此,包含 AdRotator 控件的页面只在服务器端进行缓存。
缓存用户控件
可以通过三种方式来实现:使用@OutputCache指令声明的方式、在代码隐藏文件中使用PartialCachingAttribute类设置用户控件缓存、使用ControlCachePolicy类以编程方式。
使用@OutputCache指令
需要注意的是用户控件的@OutputCache指令只有6个属性,Duration、Shared、SqlDependency、VaryByControl、VaryByCustom和VaryByParam。例如: <%@ OutputCache Duration="60" VaryByParam="State" %>,当用户在访问URL链接(http://localhost/Default.aspx?State=ca http://localhost/Default.aspx?State=us )的时候,就会缓存用户控件的2个不同版本。同样,还可以设置VaryByControl属性,例如<%@ OutputCache Duration="60" VaryByControl="State" %>,State指用户控件中ID为“State”的服务器控件,缓存将根据该控件的变化来存储用户控件数据。
使用PartialCachingAttribute类
示例代码:
[PartialCaching(60)]
public partial class NewUserControl :UserControl
{......}
以上代码表示缓存的有效期是60秒,这与在用户控件页面头部声明<%@ OutputCache Duration="60" VaryByParam=none %>的效果是一致的。需要注意的是,以这种方式缓存用户控件还有一个必要条件,必须使用TemplateControl.LoadControl方法动态加载用户控件,将用户控件插入页面的控件层次结构中才能生效。
PartialCachingAttribute 构造函数
名称 | 说明 |
---|---|
PartialCachingAttribute (Int32) | 使用分配给要缓存的用户控件的指定持续时间初始化 PartialCachingAttribute 类的新实例。 |
PartialCachingAttribute (Int32, String, String, String) | 初始化 PartialCachingAttribute 类的新实例,指定缓存持续时间、所有 GET 和 POST 值、控件名和用于改变缓存的自定义输出缓存要求。 |
PartialCachingAttribute (Int32, String, String, String, Boolean) | 初始化 PartialCachingAttribute 类的新实例,指定缓存持续时间、所有 GET 和 POST 值、控件名、用于改变缓存的自定义输出缓存要求以及用户控件输出是否可在多页间共享。 |
PartialCachingAttribute (Int32, String, String, String, String, Boolean) | 初始化 PartialCachingAttribute 类的新实例,指定缓存持续时间、所有 GET 和 POST 值、控件名、用于改变缓存的自定义输出缓存要求、数据库依赖项以及用户控件输出是否可在多页间共享。 |
使用ControlCachePolicy类
ControlCachePolicy是 .NET Framework 2.0 版中是新增的类,提供对 ASP.NET 用户控件的输出缓存设置的编程访问。HttpCachePolicy类用于访问页面输出缓存,而ControlCachePolicy类用于访问用户控件的输出缓存。
使用 ControlCachePolicy 类是可用于启用输出缓存的几种方法之一。下表介绍可用来启用输出缓存的方法:
在声明性方案中使用 @ OutputCache 指令来启用输出缓存。
在代码隐藏文件中使用 PartialCachingAttribute 属性为用户控件启用缓存。
使用 ControlCachePolicy 类在使用 BasePartialCachingControl 实例的编程方案中指定缓存设置,该实例已使用上述方法之一启用了缓存并已使用 System.Web.UI.TemplateControl.LoadControl 方法动态加载。ControlCachePolicy 实例仅在控件生命周期的 Init 和 PreRender 阶段之间才能成功操作。如果在 PreRender 阶段后修改 ControlCachePolicy 对象,则 ASP.NET 会引发异常,因为呈现控件后所进行的任何更改实际上都无法影响缓存设置(控件在 Render 阶段缓存)。最后,在实际呈现后,只能使用编程方式对用户控件实例(及其 ControlCachePolicy 对象)进行操作。
ControlCachePolicy 属性
名称 | 说明 | |
---|---|---|
Cached | 获取或设置一个值,该值指示是否为用户控件启用片段缓存。 | |
Dependency | 获取或设置与缓存的用户控件输出关联的 CacheDependency 类的实例。 | |
Duration | 获取或设置缓存的项将在输出缓存中保留的时间。 | |
SupportsCaching | 获取一个值,该值指示用户控件是否支持缓存。 | |
VaryByControl | 获取或设置要用来改变缓存输出的控件标识符列表。 | |
VaryByParams | 获取或设置要用来改变缓存输出的 GET 或 POST 参数名称列表。 |
示例:下面的代码示例演示如何在运行时动态加载用户控件,以及如何以编程方式操作用户控件。PartialCachingAttribute 属性应用于一个名为 SimpleControl 的用户控件,这意味着该用户控件在运行时由 PartialCachingControl 控件包装。SimpleControl 对象的缓存设置可以通过其关联的 ControlCachePolicy 对象以编程方式进行操作,通过引用包装该对象的 PartialCachingControl 控件可获得该对象。在此示例中,在页初始化期间检查 Duration 属性并在满足某些条件的前提下使用 SetSlidingExpiration 和 SetExpires 方法更改该属性。
示例代码
实现缓存后替换
有三种方法可以实现缓存后替换:以声明方式使用 Substitution 控件。以编程方式使用 Substitution 控件 API。以隐式方式使用 AdRotator 控件。
Substitution 控件
ASP.NET Substitution 控件指定缓存页中动态创建而不进行缓存的部分。将 Substitution 控件放置在该页上要显示动态内容的位置。
在运行时,Substitution 控件调用使用 MethodName 属性指定的方法。该方法必须返回一个字符串,然后该字符串替换 Substitution 控件的内容。该方法必须是 Page 或 UserControl 包含控件上的静态方法。
使用 Substitution 控件可以将客户端可缓存性更改为服务器可缓存性,以便该页面不会在客户端上进行缓存。这样可以确保以后对该页的请求能够再次调用该方法以生成动态内容。
Substitution API
若要以编程方式为缓存页创建动态内容,可以在页代码中将某个方法的名称作为参数传递给 WriteSubstitution 方法来调用该方法。该方法处理动态内容的创建,它采用单个 HttpContext 参数并返回一个字符串。该返回字符串是将在给定位置被替换的内容。通过调用 WriteSubstitution 方法来代替以声明方式使用 Substitution 控件的一个好处是可以调用任意对象的方法,而不只是调用 Page 或 UserControl 对象的静态方法。
调用 WriteSubstitution 方法可以将客户端可缓存性更改为服务器可缓存性,以便该页不会在客户端上进行缓存。这样可以确保以后对该页的请求能够再次调用该方法以生成动态内容。
AdRotator 控件
AdRotator 服务器控件在内部实现对缓存后替换的支持。如果将 AdRotator 控件放在页面上,则无论是否缓存父页,都将在每次请求时呈现其特有的广告。因此,包含 AdRotator 控件的页面只在服务器端进行缓存。