页面输出缓存

      本缓存机制是.NET环境中比较简单的缓存机制,其作用是将整个aspx页面的内容保存在服务器的内存中。这样,用户在访问该页面的时候,直接从服务器内存中调用,而不用和数据库进行交互,除非缓存数据过期,才重新从数据库取一次数据。这样的环境比较适合于一些经常不用变动的数据页面。

      使用方法非常简单,在aspx页面顶部添加如下声明。

<%@ OutputCache Duration="60" VaryByParam="none" %>

 

      对于上面的声明,解释一下参数的意思:

      Duration:缓存过期时间(单位:秒)。上述声明表示本页面在每60秒过期一次(即:在60秒时间内,该页面是读取的服务器缓存里面的数据,并没有直接从数据库获取数据),这个参数是必填的!

      VaryByParam:根据POST(或GET)过来的参数来更新缓存内容,如果需要多个参数,用分号隔开。如果不想要任何参数来修改缓存内容,则将其值设置为:none;如果希望所有的参数都能修改缓存内容,则将其值设置为:*。

      范例如下:

测试页面缓存 - 前台代码

 1 <%@ Page Language="C#"  CodeBehind="Default.aspx.cs" Inherits="TestWebCache.Default" %>
 2 <%@ OutputCache Duration="60" VaryByParam="none" %>
 3 
 4 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 5 
 6 <html xmlns="http://www.w3.org/1999/xhtml" >
 7 <head runat="server">
 8     <title>测试页面缓存</title>
 9 </head>
10 <body>
11     <form id="form1" runat="server">
12         <asp:Literal ID="Literal1" runat="server" />
13     </form>
14 </body>
15 </html>
1 protected void Page_Load(object sender, EventArgs e)
2 {
3     if (!IsPostBack)
4     {
5         Literal1.Text = DateTime.Now.ToString();
6     }
7 }


 

       如果想根据Url里面的某一个参数进行缓存的更新,则可以在“VaryByParam”的等号后面添加该参数的名称,例如,普通情况下,在访问本页面的时候,我们可以输入Url为:http://localhost:17112/Default.aspx,即使是带有参数的情况下访问该页面,例如:http://localhost:17112/Default.aspx?a=1,也不会对页面的内容有任何的影响,因为在页面顶部声明缓存的时候,我将“VaryByParam”后面的值填的“none”,如果将此值改为上面第二个Url中的参数“a”,则本页面会因为参数“a”的改变而改变页面内容,当“a”在赋相同的值的时候,页面没有变化,如果在页面过期时间(即:60秒)内,改变参数“a”的值,页面的内容也会产生相应的变化。

      如果需要的是多个参数,例如:http://localhost:17112/Default.aspx?a=1&b=2&c=3,那么,在声明页面缓存的时候,应该将“VaryByParam”的值赋为:a;b;c,即:VaryByParam="a;b;c"。

      OutputCache 指令中的其它属性参数描述如下:

OutputCache 其它属性
 <%@
    OutputCache Duration="#ofseconds"
    Location="Any Client Downstream Server None ServerAndClient"
    Shared="True False"
    VaryByControl="controlname"
    VaryByCustom="browser customstring"
    VaryByHeader="headers"
    VaryByParam="parametername" 
    CacheProfile="cache profile name ''"
10    NoStore="true false"
11    SqlDependency="database/table name pair CommandNotification"
12 %>

 

      当然,如果很多页面都添加了页面缓存,而且它们的缓存时间又都设置得是一样的,这个时候,我们就可以利用web.config来统一配置这些缓存的过期时间,这样可以达到一处改动,在多处都能起到相应的作用,配置的范例如下:

web.config的配置

<system.web>
2   <caching>
3     <outputCacheSettings>
4       <outputCacheProfiles>
5         <add name="CacheConfig" duration="60" />
6       </outputCacheProfiles>
7     </outputCacheSettings>
8   </caching>
</system.web>


 

      这样一来,我们在页面顶部就可以添加如下所示的页面缓存声明方式就可以了:

<%@ OutputCache CacheProfile="CacheConfig" VaryByParam="none" %>

 

      但是需要注意几点:

            1、如果在页面中的用户控件内声明OutputCache,是不支持CacheProfile属性的。

            2、所添加的CacheProfile必须在web.config中存在。

      还可以通过页面中的控件的变化,来修改页面缓存,声明如下所示(假设页面上存在一个ID为DropDownList1的下拉菜单):

<%@ OutputCache Duration="60" VaryByParam="none" VaryByControl="DropDownList1" %>

 

      上面说了这么多,全都是在前台页面上来设置页面缓存,.NET还提供了通过后台代码来实现页面缓存。页面输出缓存API的缓存策略就是用Response的Cache属性,该方式的核心是调用System.Web.HttpCachePolicy。该类主要包含了用户设置缓存特定的HTTP标头的方法和用于控制ASP.NET页面输出缓存的方法。下面说几个常用的方法:

      SetExpires 用于设置缓存过期的绝对时间。它的参数是一个DataTime类的实例,表示过期的绝对时间。

    SetLastModified 用于设置页面的Last-Modified HTTP标头。Last-Modified HTTP标头表示页面上次修改时间,缓存将依靠它来进行计时。如果违反了缓存限制层次结构,此方法将失败。该方法的参数是一个DataTime类的实例。

    SetSlidingExpiration 该方法将缓存过期从绝对时间设置为可调时间。其参数是一个布尔值。当参数为true时,Cache-Control HTTP标头将随每个响应而更新。此过期模式与相对于当前时间将过期标头添加到所有输出集的IIS配置选项相同。当参数为False时,将保留该设置,且任何启用可调整过期的尝试都将静态失败。此方法不直接映射到HTTP标头。它由后续模块或辅助请求来设置源服务器缓存策略。

    SetOmitVaryStar ASP.NET 2.0新增的方法。用于指定在按参数进行区分时,响应是否应该包含vary:*标头。方法参数是一个布尔值,若要指示HttpCachePolicy不对其VaryByHeaders属性使用*值,则为true;否则为false。

    SetCacheability 用于设置页面的Cache-Control HTTP标头。该标头用于控制在网络上缓存文档的方式。该方法有两种重载方式,所不同的是参数。一种重载方法的参数是HttpCacheability枚举值,包括NoCache、Private、Public、Server、ServerAndNoCache和ServerAndPrivate(有关这些枚举值的定义,可参考MSDN)。另一种方法的参数有两个,一个参数是HttpCacheability枚举值,另一个参数是字符串,表示添加到标头的缓存控制扩展。需要注意的是,仅当与Private或NoCache指令一起使用时,字段扩展名才有效。如果组合不兼容的指令和扩展,则此方法将引发无效参数异常。