ASP.NET的输出缓存OutputCacheVaryByParam

转 http://blog.csdn.net/ITFLY8/archive/2007/07/20/1700376.aspx
ASP.NET的输出缓存
衡量高性能、可缩放的 web 应用程序最重要的一个指标就是缓存了。 ASP.NET 提供了高性能的 web 应用程序的缓存功能 ,ASP.NET  有三种可由  Web  应用程序使用的缓存:
·  输出缓存 ,它缓存请求所生成的动态响应。
·  片断缓存 ,它缓存请求所生成的响应的各部分。
·  数据缓存 ,它以编程方式缓存任意对象。为支持这种缓存, ASP.NET  提供了全功能的缓存引擎,使程序员能够轻松地在请求间保留数据。
页的输出缓存是非常有用的。在海量的访问站点中,有些页面的访问频率占了非常大的比重,即使对这些页使用输出缓存很少的时间,也会减轻系统不少的负担,因为后面对这些页面的请求将不在执行创建该页的代码。
但是,这样显得不够灵活,页的请求可能的确是很多,然而在页面上我们缓存了所有的东西,无论是构造成本高还是构造成本低的部分。能否有一种可以缓存页的部分的数据呢?幸运的是 ASP.NET 提供了针对每个请求来创建或自定义该页的各部分。比如说我们可以对页面上构造成本很高的用户控件做片断缓存。
ASP.NET  缓存支持文件和缓存键依赖项,使开发人员可以使缓存项依赖于外部文件或其他缓存项。此项技术可用于在项的基础数据源发生更改时使该项无效。  ASP.NET 可以将这些项存储在  Web  服务器上或请求流中的其他软件上,例如代理服务器或浏览器。这可以使您避免重新创建满足先前请求的信息,特别是当在服务器上创建时要求大量处理器时间或其他资源的信息。
Petshop的页缓存设置
我们可以可通过使用低级别的  OutputCache API  或高级别的  @ OutputCache  指令来实现页的输出缓存。 启用输出缓存后,当发出对页的第一个  GET  请求时创建一个输出缓存项。随后的  GET  或  HEAD  请求由该输出缓存项服务,直到该缓存请求过期。 输出缓存还支持缓存的  GET  或  POST  名称 / 值对的变体。
输出缓存遵循页的过期和有效性策略。如果某页位于输出缓存中,并且有一个过期策略标记指示该页自缓存起  60  分钟后过期,则在  60  分钟后将该页从输出缓存中移除。如果此后接收到另一个请求,则执行页代码,并且可以再次缓存该页。
下面的指令在响应时激活输出缓存:
<%@ OutputCache Duration="60" VaryByParam="none"%>
Duration 和 VaryByParam 是必选参数,前者标识过期时间,后者表示 GET 或  POST  名称 / 值对的字符串。如果不使用该属性,可是设置为 none 。在这里我们还要说明一个参数 VaryByCustom ,使用这个参数,我们可以自定义输出缓存要求的任意文本。除了在 OutputCache 指令里面申明该属性之外,我们还得在应用程序的  global.asax  文件的代码声明块中,重写  GetVaryByCustomString  方法来为自定义字符串指定输出缓存的行为。
举一列来说:
<%@ OutputCache VaryByParam="none" VaryByCustom="CategoryPageKey" Location="server" Duration="43200" %>
这里的 VaryByCustom 定义的为 CategoryPageKey ,那么在 global.asax 里面我们必须定义 CategoryPageKey 这个字符创输出缓存的行为,见下面代码。
public  override string GetVaryByCustomString(HttpContext context, String arg) {
              string cacheKey = "";
              switch(arg) {
                   case "CategoryPageKey":
                       if (Request.IsAuthenticated == true) {
                            cacheKey = "QQQ" + context.Request.QueryString["category_id"] + context.Request.QueryString["requestedPage"];
                       }
                       else {
                            cacheKey = "AAA" + context.Request.QueryString["category_id"] + context.Request.QueryString["requestedPage"];
                       }
                       break;
                   case "SearchPageKey" :
                       if (Request.IsAuthenticated == true) {
                            cacheKey = "QQQ" + context.Request.QueryString["search_text"] + context.Request.QueryString["requestedPage"];
                       }
                       else {
                            cacheKey = "AAA" + context.Request.QueryString["search_text"] + context.Request.QueryString["requestedPage"];
                       }
                       break;
                   case "ProductPageKey" :
                       if (Request.IsAuthenticated == true) {
                            cacheKey = "QQQ" + context.Request.QueryString["name"] + context.Request.QueryString["product_id"] + context.Request.QueryString["requestedPage"];
                       }
                       else {
                                 cacheKey = "AAA" + context.Request.QueryString["name"] + context.Request.QueryString["product_id"] + context.Request.QueryString["requestedPage"];
                       }
                       break;
                   case "ProductDetailsPageKey" :
                       if (Request.IsAuthenticated == true) {
                            cacheKey = "QQQ" + context.Request.QueryString["item_id"] + context.Request.QueryString["requestedPage"];
                       }
                       else {
                            cacheKey = "AAA" + context.Request.QueryString["item_id"] + context.Request.QueryString["requestedPage"];
                       }
                       break;
                   case "UserID" :
                       if (Request.IsAuthenticated == true) {
                            cacheKey = "UserID_In";
                       }
                       else {
                            cacheKey = "UserID_Out";
                       }
                       break;
              }
              return cacheKey;
         }
从上面对 CategoryPageKey 字符创所作的行为来看,当我们的请求页面中含有对特定的 category_id的某一分页显示的数据页的请求时,将调用缓存(自然是已经缓存了该页)。
下表列出了petshop的web应用程序的输出缓存设置。
ASP.NET WebForms
Cache setting
Duration
ControlHeader
<%@ OutputCache
         Duration="43200"         
         VaryByParam="none"
         VaryByCustom="UserID" %>
12 hours
Default
<%@ OutputCache
         Duration="43200"
         VaryByParam="none"
         VaryByCustom="UserID" %>
12 hours
Help
<%@ OutputCache
         Duration="43200" 
         VaryByParam="none"
         VaryByCustom="UserID" %>
12 hours
Category
<%@ OutputCache
         Duration="43200" 
         VaryByParam="none"
         VaryByCustom="CategoryPageKey " %>
12 hours
Product
<%@ OutputCache
         Duration="43200" 
         VaryByParam="none"
         VaryByCustom="ProductPageKey " %>
12 hours
ProductDetails
<%@ OutputCache
         Duration="43200" 
         VaryByParam="none"
         VaryByCustom="ProductDetailsPageKey " %>
12 hours
Search
<%@ OutputCache
         Duration="43200" 
         VaryByParam="none"
         VaryByCustom="SearchPageKey " %>
12 hours
显然 petshop 的 web 页面上部的 ControlHeader 是随着用户登陆的状态有关的,故其设置了 VaryByCustom 属性以来标识用户不同登陆状态的缓存版本。而 Category 页面由于可能被大量的访问,并且数据量很大,是十分有必要缓存的,但是由于数据的随机性很大,存在不同的版本,比如说是不同类别的 Category ,甚至不同的分页显示的数据页,在这里采用了 VaryByCustom 属性以缓存不同版本的页。
Petshop片断缓存
在前面我们提到 ASP.NET 可以提供页的局部数据的缓存,通常是一些构造代价较大的部分,诸如用户控件。在 petshop 里面,大量使用了用户控件(尤其是 .NET 示例程序 Duwamish7.0 使用了更多的用户控件,那些页面简直就是控件的拼装),用户控件的缓存设置方法和 aspx 页的缓存设置方法基本相同,在这里我们不再列出。只有 ControlHeader 控件使用了缓存设置,见上表。
 
声明的方式控制   ASP.NET   页或页中包含的用户控件的输出缓存策略。有关输出缓存的更多信息,请参见   ASP.NET   缓存功能。   
    
  <%@   OutputCache   Duration="#ofseconds"   Location="Any   |   Client   |   Downstream   |   Server   |   None"   Shared="True   |   False"   VaryByControl="controlname"   VaryByCustom="browser   |   customstring"   VaryByHeader="headers"   VaryByParam="parametername"   %>   
  属性   
  Duration     
  页或用户控件进行缓存的时间(以秒计)。在页或用户控件上设置该属性为来自对象的   HTTP   响应建立了一个过期策略,并将自动缓存页或用户控件输出。     
  注意       该属性是必需的。如果未包含该属性,将出现分析器错误。   
  Location     
  OutputCacheLocation   枚举值之一。默认值为   Any。     
  警告       包含在用户控件(.ascx   文件)中的   @   OutputCache   指令不支持此属性。   
  Shared     
  一个布尔值,确定用户控件输出是否可以由多个页共享。默认值为   false。有关详细信息,请参见备注部分。     
  注意       包含在   ASP.NET   页(.aspx   文件)中的   @   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。如果要使输出缓存根据所有参数值发生变化,请将属性设置为   *。   
  VaryByControl     
  一个分号分隔的字符串列表,用于更改用户控件的输出缓存。这些字符串代表在用户控件中声明的   ASP.NET   服务器控件的   ID   属性值。有关详细信息,请参见缓存   ASP.NET   页的某些部分。     
  注意       除非已经包含了   VaryByParam   属性,否则在用户控件   @   OutputCache   指令中,该属性是必需的。ASP.NET   页中的   @   OutputCache   指令不支持该属性。   
  备注   
  为页输出缓存设置值与通过   HttpResponse.Cache   属性操作   HttpCachePolicy.SetExpires   和   HttpCachePolicy.SetCacheability   方法相同。如果在创建用户控件时设置   VaryByParam   属性,可实现该控件的部分页缓存。   
    
  如果   Web   窗体页要求用户查看授权,则输出缓存将   Cache-Control   HTTP   标头设置为   private。有关所有这些主题的详细信息,请参见缓存   ASP.NET   页。   
    
  如果将   Shared   属性设置为   true,则缓存的用户控件输出可以被多个   Web   窗体页访问。如果不设置为   true,默认行为是为包含用户控件的每一页缓存用户控件输出的一个版本。通过启用   Shared   属性,可以潜在地节省大量的内存。有关详细信息,请参见缓存   ASP.NET   页的某些部分。   
    
  示例   
  下面的示例说明了如何设置页或用户控件进行输出缓存的持续时间。   
    
  <%@   OutputCache   Duration="100"   VaryByParam="none"   %>   
  下一个示例说明了如何指示输出缓存来对页或用户控件进行缓存,此缓存处理是根据来自窗体的   POST   或来自查询字符串的位置和计数窗体参数进行的。每个收到的具有不同位置或计数参数(或两者)的   HTTP   请求都进行   10   秒的缓存处理。带有相同参数值的任何后继请求都将从缓存中得到满足,直至超过输入的缓存期。   
    
  <%@   OutputCache   Duration="100"   VaryByParam="location;count"   %>  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值