整理了一下MSDN中关于ASP.NET缓存机制的论述

本文介绍了ASP.NET中的两种缓存机制:应用程序缓存和页输出缓存。应用程序缓存用于存储频繁访问或处理成本高的数据,而页输出缓存则缓存已处理页的内容,以减少重复处理。文章还探讨了缓存项的过期策略、依赖项管理以及如何通过编程和声明方式设置缓存。

通常,应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能。例如,如果应用程序使用复杂的逻辑来处理大量数据,然后再将数据作为用户频繁访问的报表返回,避免在用户每次请求数据时重新创建报表可以提高效率。同样,如果应用程序包含一个处理复杂数据但不需要经常更新的页,则在每次请求时服务器都重新创建该页会使工作效率低下。

在这些情况下,为了帮助您提高应用程序的性能,ASP.NET 使用两种基本的缓存机制来提供缓存功能。第一种机制是应用程序缓存,它允许您缓存所生成的数据,如 DataSet 或自定义报表业务对象。第二种机制是页输出缓存,它保存页处理输出,并在用户再次请求该页时,重用所保存的输出,而不是再次处理该页。

应用程序缓存

应用程序缓存提供了一种编程方式,可通过键/值对将任意数据存储在内存中。使用应用程序缓存与使用应用程序状态类似。但是,与应用程序状态不同的是,应用程序缓存中的数据是易失的,即数据并不是在整个应用程序生命周期中都存储在内存中。使用应用程序缓存的优点是由 ASP.NET 管理缓存,它会在项过期、无效、或内存不足时移除缓存中的项。还可以配置应用程序缓存,以便在移除项时通知应用程序。有关更多信息,请参见缓存应用程序数据

使用应用程序缓存的模式是,确定在访问某一项时该项是否存在于缓存中,如果存在,则使用。如果该项不存在,则可以重新创建该项,然后将其放回缓存中。这一模式可确保缓存中始终有最新的数据。

有关更多信息,请参见如何:检索缓存项的值

页输出缓存

页输出缓存在内存中存储处理后的 ASP.NET 页的内容。这一机制允许 ASP.NET 向客户端发送页响应,而不必再次经过页处理生命周期。页输出缓存对于那些不经常更改,但需要大量处理才能创建的页特别有用。例如,如果创建大通信量的网页来显示不需要频繁更新的数据,页输出缓存则可以极大地提高该页的性能。可以分别为每个页配置页缓存,也可以在 Web.config 文件中创建缓存配置文件。利用缓存配置文件,只定义一次缓存设置就可以在多个页中使用这些设置。

页输出缓存提供了两种页缓存模型:整页缓存和部分页缓存。整页缓存允许将页的全部内容保存在内存中,并用于完成客户端请求。部分页缓存允许缓存页的部分内容,其他部分则为动态内容。有关更多信息,请参见缓存 ASP.NET 页

部分页缓存可采用两种工作方式:控件缓存和缓存后替换。控件缓存有时也称为分段缓存,这种方式允许将信息包含在一个用户控件内,然后将该用户控件标记为可缓存的,以此来缓存页输出的部分内容。这一方式可缓存页中的特定内容,并不缓存整个页,因此每次都需重新创建整个页。例如,如果要创建一个显示大量动态内容(如股票信息)的页,其中有些部分为静态内容(如每周总结),这时可以将静态部分放在用户控件中,并允许缓存这些内容。

缓存后替换与控件缓存正好相反。这种方式缓存整个页,但页中的各段都是动态的。例如,如果要创建一个在规定时间段内为静态的页,则可以将整个页设置为进行缓存。如果向页添加一个显示用户名的 Label 控件,则对于每次页刷新和每个用户而言,Label 的内容都将保持不变,始终显示缓存该页之前请求该页的用户的姓名。但是,使用缓存后替换机制,可以将页配置为进行缓存,但将页的个别部分标记为不可缓存。在此情况下,可以向不可缓存部分添加 Label 控件,这样将为每个用户和每次页请求动态创建这些控件。有关更多信息,请参见缓存 ASP.NET 页的某些部分

根据请求参数缓存页

除缓存页的单一版本外,ASP.NET 页输出缓存还提供了一些功能,可以创建根据请求参数的不同而不同的页的多个版本。有关更多信息,请参见缓存页的多个版本

自动移除数据

出于以下原因之一,ASP.NET 可以从缓存中移除数据:

  • 由于服务器上的内存不足,开始一个称为“清理”的过程。

  • 由于缓存中的项已过期。

  • 由于项的依赖项发生了更改。

为了帮助管理缓存项,在将项从缓存中移除时,ASP.NET 会通知应用程序。

清理

清理是在内存不足时从缓存中删除项的过程。如果某些项在一段时间内未被访问,或是在添加到缓存中时被标记为低优先级,则这些项会被移除。ASP.NET 使用 CacheItemPriority 对象来确定要首先清理的项。有关更多信息,请参见如何:将项添加到缓存中

过期

除了清理外,在缓存项过期时,ASP.NET 会自动从缓存中移除这些项。向缓存添加项时,可以按下表中的描述设置其过期时间。

过期类型说明

可调过期

指定某项自上次被访问后多长时间过期。例如,可以将某项设置为自上次在缓存中被访问后 20 分钟过期。

绝对过期

指定某项在设定的时间过期,而不考虑访问频率。例如,可以将某项设置为在 6:00 PM 过期,或四小时后过期。

依赖项

可以将缓存中某一项的生存期配置为依赖于其他应用程序元素,如某个文件或数据库。当缓存项依赖的元素更改时,ASP.NET 将从缓存中移除该项。例如,如果您的网站显示一份报告,该报告是应用程序通过 XML 文件创建的,您可以将该报告放置在缓存中,并将其配置为依赖于该 XML 文件。当 XML 文件更改时,ASP.NET 会从缓存中移除该报告。当代码请求该报告时,代码会先确定该报告是否在缓存中,如果不在,代码会重新创建该报告。因此,始终都有最新版本的报告可用。

ASP.NET 缓存支持下表中描述的依赖项。

依赖项说明

键依赖项

应用程序缓存中的项存储在键/值对中。键依赖项允许项依赖于应用程序缓存中另一项的键。如果移除了原始项,则具有键依赖关系的项也会被移除。例如,可以添加一个名为 ReportsValid 的缓存项,然后缓存若干个依赖于 ReportsValid 键的报告。当 ReportsValid 项被移除时,所有依赖于它的缓存报告同样也会从缓存中移除。

文件依赖项

缓存中的项依赖于外部文件。如果该文件被修改或删除,则缓存项也会被移除。

SQL 依赖项

缓存中的项依赖于 Microsoft SQL Server 2005、SQL Server 2000 或 SQL Server 7.0 数据库中表的更改。对于 SQL Server 2005,缓存中的项可依赖于表中的某一行。有关更多信息,请参见使用 SqlCacheDependency 类在 ASP.NET 中缓存

聚合依赖项

通过使用 AggregateCacheDependency 类缓存中的项依赖于多个元素。如果任何依赖项发生更改,该项都会从缓存中移除。

自定义依赖项

可以用您自己的代码创建的依赖关系来配置缓存中的项。例如,可以创建一个自定义 Web 服务缓存依赖项,当调用 Web 服务得到一个特定值时,该依赖项就会从缓存中移除数据。

应用程序缓存项移除通知

当项从应用程序缓存中移除时,您可以收到通知。例如,如果有一个需要大量处理时间才能创建的项,当从缓存中移除该项时,您会收到通知以便可以立即替换该项。这样,下次请求该项时,用户便不必等待处理该项。有关更多信息,请参见如何:从缓存中移除项时通知应用程序

(一)如何:检索缓存项的值
通过在 Cache 对象中进行检查来确定该项是否不为 null(在 Visual Basic 中为 Nothing)。如果该项存在,则将它分配给变量。否则,重新创建该项,将它添加到缓存中,然后访问它。
string cachedString;
cachedString = (string)Cache["CacheItem"];
if (cachedString == null)
{
cachedString = "Hello, World.";
Cache.Insert("CacheItem", cachedString);
}


(二)如何:将项添加到缓存中

可以使用 Cache 对象的 Insert 方法向应用程序缓存添加项。该方法向缓存添加项,并且通过几次重载,您可以用不同选项添加项,以设置依赖项、过期和移除通知。如果使用 Insert 方法向缓存添加项,并且已经存在与现有项同名的项,则缓存中的现有项将被替换

还可以使用 Add 方法向缓存添加项。使用此方法,您可以设置与 Insert 方法相同的所有选项;然而,Add 方法将返回您添加到缓存中的对象。另外,如果使用 Add 方法,并且缓存中已经存在与现有项同名的项,则该方法不会替换该项,并且不会引发异常。

1.通过键和值直接设置项向缓存添加项
通过指定项的键和值,像将项添加到字典中一样将其添加到缓存中。

下面的代码示例将名为 CacheItem1 的项添加到 Cache 对象中:
Cache["CacheItem1"] = "Cached Item 1";


2. 通过使用 Insert 方法将项添加到缓存中
调用 Insert 方法,传递要添加的项的键和值。
下面的代码示例添加名为 CacheItem2 的字符串:
Cache.Insert("CacheItem2", "Cached Item 2");


3.通过指定依赖项向缓存添加项
调用 Insert 方法,将 CacheDependency 对象的一个实例传递给该方法

下面的代码示例添加名为 CacheItem3 的项,该项依赖于缓存中名为 CacheItem2 的另一个项:
string[] dependencies = { "CacheItem2" };
Cache.Insert("CacheItem3", "Cached Item 3",
new System.Web.Caching.CacheDependency(null, dependencies));

下面的代码示例演示将名为 CacheItem4 的项添加到缓存中,并且在名为 XMLFile.xml 的文件上设置文件依赖项:
Cache.Insert("CacheItem4", "Cached Item 4",
new System.Web.Caching.CacheDependency(
Server.MapPath("XMLFile.xml")));


下面的代码示例演示如何创建多个依赖项。它向缓存中名为 CacheItem1 的另一个项添加键依赖项,向名为 XMLFile.xml 的文件添加文件依赖项。

System.Web.Caching.CacheDependency dep1 =
new System.Web.Caching.CacheDependency(Server.MapPath("XMLFile.xml"));
string[] keyDependencies2 = { "CacheItem1" };
System.Web.Caching.CacheDependency dep2 =
new System.Web.Caching.CacheDependency(null, keyDependencies2);
System.Web.Caching.AggregateCacheDependency aggDep =
new System.Web.Caching.AggregateCacheDependency();
aggDep.Add(dep1);
aggDep.Add(dep2);
Cache.Insert("CacheItem5", "Cached Item 5", aggDep);


4.将设有过期策略的项添加到缓存中
调用 Insert 方法,将绝对过期时间或弹性过期时间传递给该方法。

下面的代码示例将有一分钟绝对过期时间的项添加到缓存中:

Cache.Insert("CacheItem6", "Cached Item 6",
null, DateTime.Now.AddMinutes(1d),
System.Web.Caching.Cache.NoSlidingExpiration);


下面的代码示例将有 10 分钟弹性过期时间的项添加到缓存中:
Cache.Insert("CacheItem7", "Cached Item 7",
null, System.Web.Caching.Cache.NoAbsoluteExpiration,
new TimeSpan(0, 10, 0));


5.将设有优先级设置的项添加到缓存中
调用 Insert 方法,从 CacheItemPriority 枚举中指定一个值。

下面的代码示例将优先级值为 High 的项添加到缓存中:
Cache.Insert("CacheItem8", "Cached Item 8",
null, System.Web.Caching.Cache.NoAbsoluteExpiration,
System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.High, null);


6.使用 Add 方法向缓存添加项
调用 Add 方法,它返回一个表示项的对象。

下面的代码示例向缓存添加名为 CacheItem9 的项,同时将变量 CachedItem9 的值设置为已添加的项。
string CachedItem9 = (string)Cache.Add("CacheItem9",
"Cached Item 9", null,
System.Web.Caching.Cache.NoAbsoluteExpiration,
System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.Default,
null);

(三)使用SqlCacheDependency 类缓存

ASP.NET 允许您使用 SqlCacheDependency 类创建依赖于数据库中表或行的缓存项。当表中或特定行中发生更改时,带有依赖项的项便会失效,并会从缓存中移除。可以在 Microsoft SQL Server 7.0、SQL Server 2000 和 SQL Server 2005 中设置表的依赖项。如果您使用 SQL Server 2005,还可以设置特定记录的依赖项。

1.SQL Server 7.0 和 SQL Server 2000 的实现-轮询模型

ASP.NET 为 SQL Server 7.0 和 SQL Server 2000 的缓存依赖项实现了一个轮询模型。ASP.NET 进程内的一个线程会以指定的时间间隔轮询 SQL Server 数据库,以确定数据是否已更改。如果数据已更改,缓存依赖项便会失效,并从缓存中移除。可以在 Web.config 文件中以声明方式指定应用程序中的轮询间隔,也可以使用 SqlCacheDependency 类以编程方式指定此间隔。

为了在 SQL Server 7.0 和 SQL Server 2000 中使用 SQL 缓存依赖项,必须先将 SQL Server 配置为支持缓存依赖项。ASP.NET 提供了一些实用工具,可用于配置 SQL Server 上的 SQL 缓存,其中包括一个名为 Aspnet_regsql.exe 的工具和 SqlCacheDependencyAdmin 类。

2. SQL Server 2005 实现-发布订阅机制

SQL Server 2005 为缓存依赖项实现的模型不同于 SQL Server 7.0 和 SQL Server 2000 中的缓存依赖项模型。在 SQL Server 2005 中,不需要执行任何特殊的配置步骤来启用 SQL 缓存依赖项。此外,SQL Server 2005 还实现了一种更改通知模型,可以向订阅了通知的应用程序服务器发送通知,而不是依赖早期版本的 SQL Server 中必需的轮询模型。

(四)System.Web.Caching 命名空间

System.Web.Caching 命名空间提供用于缓存服务器上常用数据的类。这包括 Cache 类,该类是一个使您可以存储任意数据对象(如哈希表和数据集)的词典。它还为这些对象提供到期功能,并提供使您可以添加和移除对象的方法。您还可以添加依赖于其他文件或缓存项的对象,并在从 Cache 中移除对象时执行回调以通知应用程序。

(五)@ OutputCache

以声明的方式控制 ASP.NET 页或页中包含的用户控件的输出缓存策略。有关输出缓存的更多信息,请参见 ASP.NET 缓存功能

<%@ 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"
%>
var ExpCollDivStr=ExpCollDivStr; ExpCollDivStr = ExpCollDivStr + "ctl00_LibFrame_ctl04cb41e6e,"; var ExpCollImgStr = ExpCollImgStr; ExpCollImgStr = ExpCollImgStr + "ctl00_LibFrame_ctl04img,"; 属性
Duration

页或用户控件进行缓存的时间(以秒计)。在页或用户控件上设置该属性为来自对象的 HTTP 响应建立了一个过期策略,并将自动缓存页或用户控件输出。

Note注意

这是必选属性。如果未包含该属性,将出现分析器错误。

Location

OutputCacheLocation 枚举值之一。默认值为 Any

Note注意

包含在用户控件(.ascx 文件)中的 @OutputCache 指令不支持此属性。

CacheProfile

与该页关联的缓存设置的名称。这是可选属性,默认值为空字符 ("")。

Note注意

包含在用户控件(.ascx 文件)中的 @OutputCache 指令不支持此属性。在页中指定此属性时,属性值必须与 outputCacheSettings 节下面的 outputCacheProfiles 元素中的一个可用项的名称匹配。如果此名称与配置文件项不匹配,将引发异常。

NoStore

一个布尔值,它决定了是否阻止敏感信息的二级存储。

Note注意

包含在用户控件(.ascx 文件)中的 @OutputCache 指令不支持此属性。将此属性设置为 true 等效于在请求期间执行以下代码:

            Response.Cache.SetNoStore();
Shared

一个布尔值,确定用户控件输出是否可以由多个页共享。默认值为 false。有关更多信息,请参见备注部分。

Note注意

包含在 ASP.NET 页(.aspx 文件)中的 @OutputCache 指令不支持此属性。

SqlDependency

标识一组数据库/表名称对的字符串值,页或控件的输出缓存依赖于这些名称对。请注意,SqlCacheDependency 类监视输出缓存所依赖的数据库中的表,因此当更新表中的项时,使用基于表的轮询时将从缓存中移除这些项。将通知(在 Microsoft SQL Server 2005 中)与 CommandNotification 值一起使用时,最终将使用 SqlDependency 类向 SQL Server 2005 服务器注册查询通知。

Note注意

SqlDependency 属性的 CommandNotification 值仅在网页 (.aspx) 中有效。用户控件只能将基于表的轮询用于 @OutputCache 指令。

VaryByCustom

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

VaryByHeader

分号分隔的 HTTP 标头列表,用于使输出缓存发生变化。将该属性设为多标头时,对于每个指定标头组合,输出缓存都包含一个不同版本的请求文档。

Note注意

设置 VaryByHeader 属性将启用在所有 HTTP 1.1 版缓存中缓存项,而不仅仅在 ASP.NET 缓存中进行缓存。用户控件中的 @OutputCache 指令不支持此属性。

VaryByParam

分号分隔的字符串列表,用于使输出缓存发生变化。默认情况下,这些字符串与随 GET 方法属性发送的查询字符串值对应,或与使用 POST 方法发送的参数对应。将该属性设置为多个参数时,对于每个指定参数组合,输出缓存都包含一个不同版本的请求文档。可能的值包括 none、星号 (*) 以及任何有效的查询字符串或 POST 参数名称。

Caution note警告

在 ASP.NET 页和用户控件上使用 @OutputCache 指令时,需要该属性或 VaryByControl 属性。如果没有包含它,则发生分析器错误。如果不希望通过指定参数来改变缓存内容,请将值设置为 none。如果希望通过所有的参数值改变输出缓存,请将属性设置为星号 (*))。

VaryByControl

一个分号分隔的字符串列表,用于更改用户控件的输出缓存。这些字符串代表用户控件中声明的 ASP.NET 服务器控件的 ID 属性值。有关更多信息,请参见缓存 ASP.NET 页的某些部分

Note注意

在 ASP.NET 页和用户控件上使用 @OutputCache 指令时,需要该属性或 VaryByParam 属性。

var ExpCollDivStr=ExpCollDivStr; ExpCollDivStr = ExpCollDivStr + "ctl00_LibFrame_ctl11ef04b7b,"; var ExpCollImgStr = ExpCollImgStr; ExpCollImgStr = ExpCollImgStr + "ctl00_LibFrame_ctl11img,"; 备注

设置页输出缓存的值与通过 Cache 属性操作 SetExpiresSetCacheability 方法的过程相同。

如果 Web 窗体页要求用户查看授权,则输出缓存将 Cache-Control HTTP 标头设置为 private。有关所有这些主题的更多信息,请参见缓存 ASP.NET 页

如果将 Shared 属性设置为 true,则多个 Web 窗体页可以访问缓存的用户控件输出。如果不将该属性设置为 true,默认行为是为包含用户控件的每一页缓存用户控件输出的一个版本。通过启用 Shared 属性,可能可以节省大量内存。有关更多信息,请参见缓存 ASP.NET 页的某些部分

var ExpCollDivStr=ExpCollDivStr; ExpCollDivStr = ExpCollDivStr + "ctl00_LibFrame_ctl17dd13140,"; var ExpCollImgStr = ExpCollImgStr; ExpCollImgStr = ExpCollImgStr + "ctl00_LibFrame_ctl17img,"; 示例

下面的代码示例演示如何设置页或用户控件进行输出缓存的持续时间。

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

下一个代码示例演示如何指示输出缓存按页或用户控件的位置对它们进行缓存,
并根据窗体的 POST 方法或查询字符串对窗体参数进行计数。每个收到的具有不同
位置或计数参数(或两者)的 HTTP 请求都进行 10 秒的缓存处理。带有相同参数值
的任何后继请求都将从缓存中得到满足,直至超过输入的缓存期。

<%@ OutputCache Duration="10" VaryByParam="location;count" %>
 
  
 
  
 
  

   

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

在控件缓存(也称为片段缓存)中,可以通过创建用户控件来包含缓存的内容,然后将用户控件
标记为可缓存来缓存部分页输出。该选项允许缓存页中的特定内容,而在每次都重新创建整个页。
例如,如果创建的页显示大量动态内容(如股票信息),但也有某些部分是静态的(如每周摘要),
则可以在用户控件中创建这些静态部分并将用户控件配置为缓存。

缓存后替换与控件缓存正好相反。它对页进行缓存,但是页中的某些片段是动态的,因此不会缓存
这些片段。
例如,如果创建的页在设定的时间段内完全是静态的(例如新闻报道页),可以设置
为缓存整个页。如果为缓存的页添加旋转广告横幅,则在页请求之间,广告横幅不会变化。然而,
使用缓存后替换,可以对页进行缓存,但可以将特定部分标记为不可缓存。在本例中,将广告横幅
标记为不可缓存。它们将在每次页请求时动态创建,并添加到缓存的页输出中。有关缓存后替换的
更多信息,请参阅动态更新缓存页的部分

控件缓存

通过创建用户控件来缓存内容,可以将页上需要花费宝贵的处理器时间来创建的某些部分(例如
数据库查询)与页的其他部分分离开。只需占用很少服务器资源的部分可以在每次请求时动态生成。

在标识了要缓存的页的部分,并创建了用以包含这些部分中的每个部分的用户控件后,您必须确定
这些用户控件的缓存策略。您可以使用 @ OutputCache 指令,或者在代码中使用
PartialCachingAttribute 类,以声明的方式为用户控件设置这些策略。

例如,如果在用户控件文件(.ascx 文件)的顶部包括下面的指令,则该控件的一个版本将在输出
缓存中存储 120 秒。

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

若要在代码中设置缓存参数,可以在用户控件的类声明中使用一个属性。例如,如果在类声明的
元数据中包括下面的属性,则该内容的一个版本将在输出缓存中存储 120 秒:

[PartialCaching(120)]
public partial class CachedControl : System.Web.UI.UserControl
{
    // Class Code
}

有关可在页输出中设置的属性的更多信息,请参阅 @ OutputCache 主题。有关如何开发用户
控件的更多信息,请参见 ASP.NET Web 服务器控件概述

Note注意

由于可在页上嵌套用户控件,您还可以嵌套已放置到输出缓存中的用户控件。可以为页和嵌套的用户控件指定不同的缓存设置。

以编程方式引用缓存的用户控件

在以声明的方式创建可缓存的用户控件时,可以包括一个 ID 属性,以便以编程方式引用
该用户控件实例。但是,在代码中引用用户控件之前,必须验证在输出缓存中是否存在该
用户控件。缓存的用户控件只在首次请求时动态生成;在指定的时间到期之前,从输出缓存
满足所有的后续请求。确定用户控件已实例化后,可以从包含页以编程方式操作该用户控件。
例如,如果通过声明方式将 SampleUserControlID 分配给用户控件,则可以使用
下面的代码检查它是否存在。

protected void Page_Load(object sender, EventArgs e)
{
    if (SampleUserControl != null)
       // Place code manipulating SampleUserControl here.
}

以不同的持续时间缓存页和用户控件

可以为页和页上的用户控件设置不同的输出缓存持续时间值。如果页的输出缓存持续时间
长于用户控件的输出缓存持续时间,则页的输出缓存持续时间优先。例如,如果页的输出
缓存设置为 100 秒,而用户控件的输出缓存设置为 50 秒,则包括用户控件在内的整个
页将在输出缓存中存储 100 秒,而与用户控件较短的时间设置无关。

下面的代码示例演示了当页的缓存持续时间长于用户控件的缓存持续时间时的效果。该页
配置为缓存 100 秒。

<%@ Page language="C#" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc01.ascx" %>
<%@ OutputCache duration="100" varybyparam="none" %>

<SampleControl:Time runat="server" /><br /> <br /> <br />

This page was most recently generated at:<p>

<% DateTime t = DateTime.Now.ToString(); 
    Response.Write(t); %>

下面的代码示例演示了包括在页中的用户控件。控件的缓存持续时间设置为 50 秒。

<% @Control language="C#" %>
<% @OutputCache duration="50" varybyparam="none" %>

This user control was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString(); 
    Response.Write(t); %>

不过,如果页的输出缓存持续时间比用户控件的输出缓存持续时间短,则即使已为某个请求
重新生成该页的其余部分,也将一直缓存用户控件直到其持续时间到期为止。例如,如果页
的输出缓存设置为 50 秒,而用户控件的输出缓存设置为 100 秒,则页的其余部分每到期
两次,用户控件才到期一次。

下面的代码演示了一个页的标记,该页中包含的用户控件的缓存持续时间长于该页的缓存
持续时间。该页配置为缓存 50 秒。

<%@ Page language="C#" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc2.ascx" %>
<%@ OutputCache duration="50" varybyparam="none" %>

<SampleControl:Time runat="server" /><br /> <br /> <br />

This page was most recently generated at:<p>
 <% DateTime t = DateTime.Now.ToString(); 
    Response.Write(t); %>

下面的代码演示了包括在页中的用户控件。控件的缓存持续时间设置为 100 秒。

<% @Control language="C#" %>
<% @OutputCache duration="100" varybyparam="none" %>

This user control was most recently generated at:<p>

<% DateTime t = DateTime.Now.ToString(); 
    Response.Write(t); %>
(七)以声明方式设置 ASP.NET 页的可缓存性
 
页或用户控件的可缓存性是指是否可以在页的响应生命周期内在设备上缓存页。可缓存页的设备
包括发出请求的浏览器、响应请求的 Web 服务器以及请求或响应流中其他任何具有缓存功能的设备,
如代理服务器。
当 Web 服务器向请求浏览器发送响应时,服务器会在响应的 HTTP 头中包含一个 Cache-Control 
字段,该字段定义可以缓存该页的设备。根据您应用程序的需要,可以分别定义哪些设备应该或不应缓
存各个 ASP.NET 页。例如,您可能希望用户登录页的可缓存性设置不同于显示产品选择的目录页的
对应设置。对于登录页,出于安全方面的考虑,您可能希望只将页缓存到服务器上,而目录页可以缓存
到任何设备上。
对于 ASP.NET 页,可以使用 HttpCacheability 枚举中的值设置可缓存性。该枚举具有下列值。
前三个值与 Cache-Control HTTP 头设置直接对应,后三个值为特殊值。
NoCache 指定发出请求的设备每次应从 Web 服务器获取响应。
Public 允许由客户端和共享(代理)缓存来缓存响应。
Private 指定响应只能在客户端上缓存,而不能由共享(代理服务器)缓存来缓存。
Server 指定仅在原始服务器上缓存响应。
ServerAndNoCache 应用 Server 和 NoCache 两者的设置,以指示在该服务器上缓存内容,
但显式拒绝其他所有服务器缓存响应的功能。
ServerAndPrivate 指定仅在原始服务器和请求客户端上缓存响应;不允许代理服务器缓存响应。
您可以通过在 @ OutputCache 指令中包含 Location 属性并指定 OutputCacheLocation 
枚举值之一,以声明的方式设置页的可缓存性。还可以使用 SetCacheability 方法为页指定
HttpCacheability 值,从而以编程方式设置该页的可缓存性。可以通过 Response 类的 Cache
属性访问该方法。

   
  1. 在页中包含 @ OutputCache 指令,并定义 DurationVaryByParam 属性。

  2. @OutputCache 指令中包含 Location 属性,并将其值定义为 OutputCacheLocation
    枚举中的下列值之一:AnyClientDownstreamServerServerAndClientNone

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

    <%@ OutputCache Duration="60" VaryByParam="None"%>
    Note注意

    默认设置为 Any。如果未定义 Location 属性,则可以将页输出缓存在与响应有关的所有具有缓存功能的网络设备上。其中包括请求客户端、原服务器、以及响应通过的任何代理服务器。

使用缓存配置文件以声明方式设置页的可缓存性

  1. 在应用程序的 Web.config 文件中定义缓存配置文件,在配置文件中包括 duration
    varyByParam 设置。

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

    <caching>
      <outputCacheSettings>
        <outputCacheProfiles>
          <add name="Cache30Seconds" duration="30" 
            varyByParam="none" />
        </outputCacheProfiles>
      </outputCacheSettings>
    </caching>
  2. 在使用配置文件的每个 ASP.NET 页中包含 @ OutputCache 指令,并将 CacheProfile
    属性设置为 Web.config 文件中定义的缓存配置文件的名称。

    下面的代码指定页应当使用名为 Cache30Seconds 的缓存配置文件:

    <%@ OutputCache CacheProfile="Cache30Seconds" %>
 
  
在页的代码中,调用  对象的  属性的  方法。
 
   
  • 下面的代码将 Cache-Control HTTP 标头设置为 Public

    Response.Cache.SetCacheability(HttpCacheability.Public);
    

    如果将 NoCacheServerAndNoCache 传递到 SetCacheability 方法以防止请求的
    浏览器在它自己的历史记录文件夹中缓存某一页,那么任何时候当某个用户单击“后退”或
    “前进”按钮时,都会请求响应的新版本。通过调用 Cache 属性的
    SetAllowResponseInBrowserHistory 方法,并且为 allow 参数传递 true 值,
    您可以按条件重写此行为。

    如果将可缓存性设置为除 NoCacheServerAndNoCache 之外的任何值,ASP.NET
    将忽略由 SetAllowResponseInBrowserHistory 方法设置的值。

(九)设置 ASP.NET 页缓存的过期时间值

若要导致某一页添加到输出缓存中,需要为该页建立到期策略。这可以通过以声明方式或编程方式来实现。

以声明方式为页设置输出缓存到期时间

  • @ OutputCache 指令包括在您要缓存其响应的 ASP.NET 页(.aspx 文件)中。将 Duration 属性设置为一个正数值,将 VaryByParam 属性设置为一个值。

    Note注意

    默认情况下,@ OutputCache 指令将 Cache-Control 标头设置为 Any

    例如,下面的 @OutputCache 指令将页的到期时间设置为 60 秒:

    <%@ OutputCache Duration="60" VaryByParam="None" %>
    Note注意

    在使用 @ OutputCache 指令时,必须包括一个 VaryByParam 属性,否则将出现分析器错误。如果不希望使用 VaryByParam 属性提供的功能,请将它的值设置为“None”。有关更多信息,请参见缓存页的多个版本

以编程方式为页设置输出缓存到期时间

  • 在该页的代码中,在 Response 对象的 Cache 属性中设置该页的到期策略。

    Note注意

    如果以编程方式设置页的到期时间,则您还必须为缓存的页设置 Cache-Control 标头。为此,请调用 SetCacheability 方法并向其传递 HttpCacheability 枚举值 Public

    下面的代码示例设置与前面过程中的 @OutputCache 指令相同的缓存策略。

    Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
    Response.Cache.SetCacheability(HttpCacheability.Public);
    Response.Cache.SetValidUntilExpires(true);

    当缓存页到期时,以后对该页的请求将导致动态生成的响应。会在指定的持续时间内缓存该响应页。

(十)动态更新缓存页的部分

对页面进行缓存可以大大提高 Web 应用程序的性能。不过,在有些情况下,需要缓存页面的大部分内容,但页面中的某些片段是动态的。例如,如果创建一个页面,其中的新闻故事在设定时间段内完全是静态的,则可以设置为缓存整个页面。如果希望提供在每次页请求时都发生变化的交替出现的广告横幅,则该页中包含该广告的部分需要是动态的。

若要允许缓存某个页面但动态地替换其中的某些内容,可以使用 ASP.NET 缓存后替换。通过使用缓存后替换,将对整个页面进行输出缓存,并将特定的部分标记为不进行缓存。在广告横幅示例中,AdRotator 控件使您可以利用缓存后替换功能,以便为每个用户及在每次刷新页时动态创建广告。

有三种方法可以实现缓存后替换:

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

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

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

Substitution 控件

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

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

使用 Substitution 控件可以将客户端可缓存性更改为服务器可缓存性,

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值