代码改变世界

asp.net页面缓存的应用

2012-03-05 16:10  xtsjh0001  阅读(293)  评论(0编辑  收藏  举报

使用@ OutputCache指令,能够实现对页面输出缓存的一般性需要。@ OutputCache指令在ASP.NET页或者页中包含的用户控件的头部声明。这种方式非常方便,只需几个简单的属性设置,就能够实现页面的输出缓存 策略。@ 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 | ''"
   NoStore="true | false"
   SqlDependency="database/table name pair | CommandNotification"
%>

CacheProfile 

用于定义与该页关联的缓存设置的名称。是可选属性,默认值为空字符("")。需要注意的是,包含在用户控件中的@ OutputCache指令不支持此属性。在页面中指定此属性时,属性值必须与Web.config文件<outputCacheSettings>配置 节下的outputCacheProfiles元素中的一个可用项的名称匹配。如果此名称与配置文件项不匹配,将引发异常。 

NoStore 

该属性定义一个布尔值,用于决定是否阻止敏感信息的二级存储。需要注意的是,包含在用户控件中的@ OutputCache指令不支持此属性。将此属性设置为true等效于在请求期间执行代码“Response.Cache.SetNoStore();”。 

Duration 

用于设置页面或者用户控件缓存的时间。单位是秒。通过设置该属性,能够为来自对象的HTTP响应建立了一个过期策略,并将自动缓存页或用户控件输出。需要注意的是,Duration属性是必需的,否则将会引起分析器错误。 

Shared 

该属性定义一个布尔值,用于确定用户控件输出是否可以由多个页共享。默认值为false。注意,包含在ASP.NET页中的@ OutputCache指令不支持此属性。 

Location 

用于指定输出缓存项的位置。其属性值是OutputCacheLocation枚举值,它们是Any、Client、Downstream、None、 Server和ServerAndClient。默认值是Any,表示输出缓存可用于所有请求,包括客户端浏览器、代理服务器或处理请求的服务器上。需要注意的是,包含在用户控件中的@ OutputCache指令不支持此属性。 

SqlDependency 

该属性标识一组数据库/表名称对的字符串值,页或控件的输出缓存依赖于这些名称对。需要注意:SqlCacheDependency类监视输出缓存所依赖 的数据库中的表,因此,当更新表中的项时,使用基于表的轮询将从缓存中移除这些项。当通知(在SQL Server 2005中)与CommandNotification值一起使用时,最终将使用SqlDependency类向SQL Server 2005服务器注册查询通知。另外,SqlDependency属性的CommandNotification值仅在ASP.NET页中有效。控件只能将 基于表的轮询用于@ OutputCache指令。 

VaryByControl 

该属性使用一个分号分隔的字符串列表来更改用户控件的输出缓存。这些字符串代表在用户控件中声明的ASP.NET服务器控件的ID属性值。除非已经包含了VaryByParam属性,否则在@ OutputCache指令中,该属性是必需的。 

VaryByCustom 

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

VaryByHeader 

该属性中包含由分号分隔的HTTP标头列表,用于使输出缓存发生变化。当将该属性设为多标头时,对于每个指定的标头,输出缓存都包含一个请求文档的不同版 本。VaryByHeader属性在所有HTTP 1.1缓存中启用缓存项,而不仅限于ASP.NET缓存。用户控件中的@ OutputCache指令不支持此属性。 

VaryByParam 

该属性定义了一个分号分隔的字符串列表,用于使输出缓存发生变化。默认情况下,这些字符串与用GET方法属性发送的查询字符串值对应,或与用POST方法 发送的参数对应。当将该属性设置为多参数时,对于每个指定的参数,输出缓存都包含一个请求文档的不同版本。可能的值包括“none”、“*”和任何有效的 查询字符串或POST参数名称。值得注意的是,在输出缓存ASP.NET页时,该属性是必需的。它对于用户控件也是必需的,除非已经在用户控件的@ OutputCache指令中包含了VaryByControl属性。如果没有包含,则会发生分析器错误。如果不需要使缓存内容随任何指定参数发生变化, 则可将该值设为“none”。如果要使输出缓存根据所有参数值发生变化,则将属性设置为“*”。

应用示例:

示例1:

以声明方式设置页的可缓存性

在页中包含 @ OutputCache 指令,并定义 Duration 和 VaryByParam 属性。

在 @ OutputCache 指令中包含 Location 属性,并将其值定义为 OutputCacheLocation 枚举中的下列值之一:Any、Client、Downstream、Server、ServerAndClient 或 None。

下面的代码演示如何将页的可缓存性设置为 60 秒:

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

下面的代码演示表示页面缓存的时间为60秒,当参数state改变时重新获取内容

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

 

示例2:

使用缓存配置文件以声明方式设置页的可缓存性
在应用程序的 Web.config 文件中定义缓存配置文件,在配置文件中包括 duration 和 varyByParam 设置。

下面的 <caching> 配置元素定义名为 Cache30Seconds 的缓存配置文件,它将在服务器上将页缓存 30 秒之久。

<caching>
  <outputCacheSettings>
    <outputCacheProfiles>
      <add name="Cache30Seconds" duration="30" 
        varyByParam="none" />
    </outputCacheProfiles>
  </outputCacheSettings>
</caching>

在使用配置文件的每个 ASP.NET 页中包含 @ OutputCache 指令,并将 CacheProfile 属性设置为 Web.config 文件中定义的缓存配置文件的名称。

下面的代码指定页应当使用名为 Cache30Seconds 的缓存配置文件:
<%@ OutputCache CacheProfile="Cache30Seconds" %>

示例3:

有时缓存整个页是不现实的,因为页的某些部分可能在每次请求时都需要更改。在这些情况下,只能缓存页的一部分。执行此操作有两个选项:控件缓存和缓存后替换。

控件缓存跟上面的类似,就是在一个控件里使用OutputCache设置缓存。

缓存后替换:主要是应用substitution和AdRotator控件。Substitution控件实际就是在缓存的页面上占了一个位置空间,然后有这个控件的method方法来确定这个位置显示什么内容。其实传递的就是显示在该位置的html代码,适合传输少量的数据。
有三种方法可以实现缓存后替换:

  • 以声明方式使用 Substitution 控件。

  • 以编程方式使用 Substitution 控件 API。

  • 以隐式方式使用 AdRotator 控件。

Substitution 控件
ASP.NET Substitution 控件指定缓存页中动态创建而不进行缓存的部分。将 Substitution 控件放置在该页上要显示动态内容的位置。

在运行时,Substitution 控件调用使用 MethodName 属性指定的方法。该方法必须返回一个字符串,然后该字符串替换 Substitution 控件的内容。该方法必须是 Page 或 UserControl 包含控件上的静态方法。

使用 Substitution 控件可以将客户端可缓存性更改为服务器可缓存性,以便该页面不会在客户端上进行缓存。这样可以确保以后对该页的请求能够再次调用该方法以生成动态内容。

举例:
在一个启用页面缓存的页面里加入控件substitution代码:

<asp:Substitution ID="Substitution1" MethodName="getDT" runat="server" />
这里的MethodName就是对应的一个静态的方法,例如返回当前时间:

   private static string getDT(HttpContext context)
    {
        return System.DateTime.Now.ToString();
    }

Substitution API
若要以编程方式为缓存页创建动态内容,可以在页代码中将某个方法的名称作为参数传递给 WriteSubstitution 方法来调用该方法。该方法处理动态内容的创建,它采用单个 HttpContext 参数并返回一个字符串。该返回字符串是将在给定位置被替换的内容。通过调用 WriteSubstitution 方法来代替以声明方式使用 Substitution 控件的一个好处是可以调用任意对象的方法,而不只是调用 Page 或 UserControl 对象的静态方法。

调用 WriteSubstitution 方法可以将客户端可缓存性更改为服务器可缓存性,以便该页不会在客户端上进行缓存。这样可以确保以后对该页的请求能够再次调用该方法以生成动态内容。

AdRotator 控件(适用于放广告)
AdRotator 服务器控件在内部实现对缓存后替换的支持。如果将 AdRotator 控件放在页面上,则无论是否缓存父页,都将在每次请求时呈现其特有的广告。因此,包含 AdRotator 控件的页面只在服务器端进行缓存。

当一个页面需要局部缓存或者局部不缓存的时候,都可以通过页面的缓存设置和Web用户控件来实现。Substitution的方式比较复杂。