在asp.net2.0页面部分缓存中使用ControlCachePolicy类
使用ControlCachePolicy类
ControlCachePolicy是.NET Framework 2.0中新增的类,主要用于提供对用户控件的输出缓存设置的编程访问。ControlCachePolicy类与19.3.2节HttpCachePolicy类实现的作用类似,只是二者所访问的对象不同。HttpCachePolicy类用于访问页面输出缓存,而ControlCachePolicy类用于访问用户缓存。
ControlCachePolicy类包含6个属性,分别是Cached、Dependency、Duration、Supports Caching、VaryByControl和VaryByParams,如表1所示。

表1 ControlCachePolicy类的常用属性及说明
示例
使用ControlCachePolicy类实现设置用户控件缓存
本示例演示了如何在运行时动态加载用户控件,以及如何以编程方式操作用户控件进行Partial CachingAttribute 属性应用于一个名为Web UserControl的用户控件,这意味着该用户控件在运行时由PartialCachingControl控件包装。WebUserControl对象的缓存设置可以通过其关联的 ControlCachePolicy对象以编程方式进行操作,通过引用包装该对象的PartialCachingControl控件可获得该对象。在此示例中,在页初始化期间检查Duration属性并在满足某些条件的前提下使用SetSliding Expiration和Set Expires方法更改该属性。示例运行结果如图1所示。

图1 使用ControlCachePolicy类实现设置用户控件缓存
程序代码如下。
程序代码导读如下所示。
以下代码是一个包含用户控件WebUserControl.ascx的ASP.NET程序,主要以编程方式实现对用户控件输出缓存的设置。在实现过程中,由于需要设置用户控件缓存,那么必须在ASP.NET页面的Page_Init事件处理程序中进行详细设置。
l 使用TemplateControl.LoadControl方法动态加载WebUserControl..ascx文件。注意,由于用户控件WebUserControl..ascx已经为PartialCachingAttribute类包装,因此,LoadControl方法的返回对象不是空引用,而是PartialCachingControl实例。
l 使用PartialCachingControl实例对象的CachePolicy属性,获取ControlCachePolicy实例对象。该对象主要用于设置用户控件输出缓存的设置。并且使用SetExpires方法和参数为False的SetSlidingExpiration方法,设置用户控件输出缓存有效期为10s,并且设置缓存为绝对过期策略。
l 利用Controls类的Add方法将设置好的用户控件添加到页面控件层次结构中。另外,@ Reference指令用于对用户控件WebUserControl.ascx进行动态编译和链接。
WebUserControl用户控件前台代码如下:
<%@ Control Language="C#" AutoEventWireup="True" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>
可用数据:
缓存起始时间:
WebUserControl用户控件后台代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
[PartialCaching(70)]
public partial class WebUserControl : System.Web.UI.UserControl
{
protected void Page_Init(object sender, EventArgs e)
{
Label1.Text = GetAvailableItems().ToString();
Label2.Text = DateTime.Now.ToLongTimeString();
}
private string GetAvailableItems()
{
SqlConnection sqlConnection = new SqlConnection("Initial Catalog=Northwind;Data Source=localhost;Integrated Security=SSPI;");
SqlCommand sqlCommand = sqlConnection.CreateCommand();
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.CommandText = "Ten Most Expensive Products";
sqlConnection.Open();