ASP.NET 2.0 版保留了 ASP.NET 1.1 版的所有缓存功能,同时添加了新功能并增强了现有功能。新功能包括缓存配置文件、自定义缓存依赖项、SQL 缓存依赖项以及在缓存页中创建动态内容(缓存后替换)。增强功能包括功能更强大的部分页(控件)缓存模型、增强的缓存配置以及输出缓存指令的改进。新缓存功能缓存配置文件缓存配置文件使您能够在应用程序的 Web.config 文件中创建缓存设置,然后在单个页上引用这些设置。这使您能够将缓存设置同时应用于多页。例如,可以定义一个名为 DailyUpdate 的缓存配置文件,它将页的缓存持续时间设置为一天。然后可以配置各个页使用 DailyUpdate 缓存配置文件,并且这些页的缓存持续时间为一天。如果将 DailyUpdate 缓存配置文件更改为不使用缓存,将停止缓存这些页。有关更多信息,请参见 ASP.NET 中的缓存配置。自定义缓存依赖项在 ASP.NET 2.0 中,您可以根据应用程序特定情况创建自己的自定义缓存依赖项。若要创建自定义缓存依赖项,请创建从 CacheDependency 继承的类并在自定义类中实现您自己的依赖项方法。例如,您可以创建在 Web 服务中轮询数据的依赖项;当数据发生变化时,您可以使缓存数据无效。若要了解通过指定依赖项向缓存添加项目的信息,请参见如何:将项添加到缓存中。SqlCacheDependencyASP.NET 2.0 引入了 SqlCacheDependency 类,它使您能够在缓存中配置一个项,以便在 Microsoft SQL Server 数据库中的表或行上拥有依赖项。当表中或特定行中发生更改时,具有依赖项的缓存项便会失效并从缓存中移除。ASP.NET 2.0 使您能够在 SQL Server 7.0、SQL Server 2000 和 SQL Server 2005 中设置表的依赖项。使用 SQL Server 2005 时,您还可以设置特定记录的依赖项。有关更多信息,请参见使用 SqlCacheDependency 类在 ASP.NET 中缓存。缓存后替换ASP.NET 2.0 现在支持缓存后替换,使您能够将页中的某一部分配置为不可缓存。因此,尽管缓存了该页,但在再次请求该页时,将重新处理它的部分内容。例如,您可以使用大多数静态内容(但不能使用在 Label 控件中显示用户名的内容)创建缓存页。如果不使用缓存后替换,用户名在所有请求中保持不变。如果使用缓存后替换,您可以将页标记为可缓存,然后将 Label 控件放置在标记为不可缓存的另一个控件中。此后每次请求该页时,都会刷新用户名。有关更多信息,请参见缓存 ASP.NET 页的某些部分。缓存增强控件缓存在 ASP.NET 1.1 中,通过设置 @ Control 指令中的参数以声明方式配置用户控件缓存。在 ASP.NET 2.0 中,可以在运行时使用 CachePolicy 对象配置用户控件缓存设置。CachePolicy 对象使您能够按照以编程方式处理页输出缓存的相同方式处理用户控件缓存。有关更多信息,请参见缓存 ASP.NET 页的某些部分。缓存配置增强除了缓存配置文件外,ASP.NET 2.0 中还引入了新的缓存配置设置,可以在应用程序的 Web.config 文件中指定这些设置。这些设置增加了您对缓存的控制,如内存使用量和缓存清理行为。有关更多信息,请参见 ASP.NET 中的缓存配置。输出缓存指令改进ASP.NET 2.0 包括新的 @ OutputCache 指令选项以及对现有选项的增强。新功能和增强功能使您能够对输出缓存功能进行声明控制,而以前只能使用 HttpCachePolicy 类以编程方式实现此类控制。例如,现在可以用声明方式设置页 @ OutputCache 指令中的 Duration 属性和 NoStore 属性。有关更多信息,请参见设置页的可缓存性。缓存应用程序数据 ASP.NET 为您提供了一个强大的、便于使用的缓存机制,用于将需要大量服务器资源来创建的对象存储在内存中。缓存这些类型的资源会大大改进应用程序的性能。缓存是由 Cache 类实现的;缓存实例是每个应用程序专用的。缓存生存期依赖于应用程序的生存期;重新启动应用程序后,将重新创建 Cache 对象。设计 Cache 类是为了便于使用。您可以将项放置在 Cache 中,并在以后使用简单的键/值对来检索这些项。有关如何执行此操作的示例,请参见如何:将项添加到缓存中和如何:检索缓存项的值。Cache 类提供了强大的功能,允许您自定义如何缓存项以及将它们缓存多长时间。例如,当缺乏系统内存时,缓存会自动移除很少使用的或优先级较低的项以释放内存。该技术也称为清理,这是缓存确保过期数据不使用宝贵的服务器资源的方式之一。当执行清理时,您可以指示 Cache 给予某些项比其他项更高的优先级。若要指示项的重要性,可以在使用 Add 或 Insert 方法添加项时指定一个 CacheItemPriority 枚举值。当使用 Add 或 Insert 方法将项添加到缓存时,您还可以建立项的过期策略。您可以通过使用 DateTime 值指定项的确切过期时间(绝对过期时间),来定义项的生存期。也可以使用 TimeSpan 值指定一个弹性过期时间,弹性过期时间允许您根据项的上次访问时间来指定该项过期之前的运行时间。一旦项过期,便将它从缓存中移除。试图检索它的值的行为将返回 null(在 Visual Basic 中为 Nothing),除非该项被重新添加到缓存中。对于存储在缓存中的易失项(例如那些定期进行数据刷新的项或那些只在一段时间内有效的项),通常设置一种过期策略:只要这些项的数据保持为最新的,就将它们保留在缓存中。例如,如果您正在编写一个应用程序,该应用程序通过另一个网站获取数据来跟踪体育比赛的比分,那么只要源网站上比赛的比分不更改,就可以缓存这些比分。在此情况下,您可以根据其他网站更新比分的频率来设置过期策略。您可以编写代码来确定缓存中是否是最新的比分。如果该比分不是最新的,则代码可以从源网站读取比分并缓存新值。最后,ASP.NET 允许您根据外部文件、目录(文件依赖项)或另一个缓存项(键依赖项)来定义缓存项的有效性。如果具有关联依赖项的项发生更改,缓存项便会失效并从缓存中移除。您可以使用该技术在项的数据源更改时从缓存中移除这些项。例如,如果您编写一个处理 XML 文件中的财务数据的应用程序,则可以从该文件将数据插入缓存中并在此 XML 文件上保留一个依赖项。当该文件更新时,从缓存中移除该项,您的应用程序重新读取 XML 文件,然后将刷新后的数据放入缓存中。注意 Cache 对象没有关于它所包含项的内容的信息。它只保留对这些对象的引用。它还提供跟踪它们的依赖项和设置到期策略的方法。ASP.NET 中的缓存配置 ASP.NET 提供了许多可用于配置页面输出缓存和缓存 API 的选项。可以在处理了页面响应后使用页面输出缓存来缓存此页面响应。也可以通过编程的方式使用缓存 API 来缓存应用程序数据。有关更多信息,请参见 ASP.NET 缓存概述。页面输出缓存配置您可以在以下这些位置配置页面输出缓存:配置文件 可以在应用程序配置层次结构的任何配置文件中配置页面输出缓存设置,包括 Machine.config 文件(用于设置计算机上所有的 Web 应用程序)和特定于应用程序的 Web.config 文件(用于设置单个应用程序)。单个页面 可以在单个页面中以声明方式或编程方式设置缓存选项。还可将在配置文件中创建的缓存配置文件应用于单个页面。用户控件 可以在单个用户控件中以声明方式或编程方式设置缓存。对于在其他情况下不缓存的页面内容来说,这是一种简便的缓存方法。Web.config 缓存配置设置在 Web.config 文件中,有两个顶级配置节可用于页输出缓存:OutputCacheSection 和 OutputCacheSettingsSection。OutputCacheSection 节用于配置应用程序范围的设置,例如是启用还是禁用页输出缓存。例如,您可以通过向 Web.config 文件中的 OutputCacheSection 添加 enableOutputCache="false" 来对整个应用程序禁用页输出缓存。由于配置文件中的设置要优先于单个页面中的缓存设置,因此,示例设置将导致不使用输出缓存。OutputCacheSettingsSection 用于配置可由单个页使用的配置文件和依赖项。例如,下面的代码创建了一个名为 CacheProfile1 的 OutputCacheProfile,它将缓存实现页 60 秒:<outputCacheSettings> <outputCacheProfiles> <add name="CacheProfile1" duration="60" /> </outputCacheProfiles></outputCacheSettings>Machine.config 缓存配置设置Machine.config 文件的配置节与 Web.config 文件的配置节基本相同,而只有一点区别:即可以锁定 Machine.config 文件中的配置设置,使任何级别的单个应用程序都无法重写这些配置设置。在宿主不希望单个应用程序修改缓存配置时,可能有必要在共享宿主方案中使用此功能。有关更多信息,请参见如何:锁定 ASP.NET 配置设置。页面缓存配置设置通过应用在配置文件中定义的缓存配置文件,可以配置单个页中的缓存。也可以在 @ OutputCache 指令中配置单个缓存属性 (property),或者通过设置页的类定义中的属性 (attribute) 进行配置。有关更多信息,请参见 @ OutputCache 和设置页的可缓存性。用户控件缓存配置设置通过设置用户控件文件中的 @ OutputCache 指令,或设置控件类定义中的 PartialCachingAttribute 属性,可以对用户控件缓存进行配置。有关更多信息,请参见缓存 ASP.NET 页的某些部分。缓存 API 配置设置可以在 Web.config 文件中配置应用程序的缓存 API。对于页面输出缓存,应用程序宿主可以在 Machine.config 文件中设置配置属性,并锁定所有应用程序的缓存配置设置。应用程序缓存 API 在 CacheSection 中进行配置。例如,您可以使用下面的配置元素来禁用项过期:<cache disableExpiration="true" />还可以通过为属性(如配置文件的 CacheSection 中的 DisableExpiration 和 DisableMemoryCollection 属性)赋值的方式来指定其他应用程序缓存 API 配置设置。
如何:将项添加到缓存中
可以使用 Cache 对象访问应用程序缓存中的项。可以使用 Cache 对象的 Insert 方法向应用程序缓存添加项。该方法向缓存添加项,并且通过几次重载,您可以用不同选项添加项,以设置依赖项、过期和移除通知。如果使用 Insert 方法向缓存添加项,并且已经存在与现有项同名的项,则缓存中的现有项将被替换。
还可以使用 Add 方法向缓存添加项。使用此方法,您可以设置与 Insert 方法相同的所有选项;然而,Add 方法将返回您添加到缓存中的对象。另外,如果使用 Add 方法,并且缓存中已经存在与现有项同名的项,则该方法不会替换该项,并且不会引发异常。
本主题中的过程阐释了向应用程序缓存添加项的如下方式:
通过键和值直接设置项,向缓存添加项。
使用 Insert 方法向缓存添加项。
向缓存添加项并添加依赖项,以便当该依赖项更改时,将该项从缓存中移除。可以基于其他缓存项、文件和多个对象设置依赖项。
将设有过期策略的项添加到缓存中。除了能设置项的依赖项以外,还可以设置项在一段时间以后(弹性过期)或在指定时间(绝对过期)过期。您可以定义绝对过期时间或弹性过期时间,但不能同时定义两者。
向缓存添加项,并定义缓存的项的相对优先级。相对优先级帮助 .NET Framework 确定要移除的缓存项;较低优先级的项比较高优先级的项先从缓存中移除。
通过调用 Add 方法添加项。
除了这里显示的依赖项,可以在 SQL Server 表上或基于自定义依赖项创建依赖项。有关更多信息,请参见 ASP.NET 缓存概述和使用 SqlCacheDependency 类在 ASP.NET 中缓存。
当从缓存中移除项时,还可以使用 CacheItemRemovedCallback 委托让应用程序缓存通知应用程序。有关完整示例,请参见如何:从缓存中移除项时通知应用程序。
通过键和值直接设置项向缓存添加项
通过指定项的键和值,像将项添加到字典中一样将其添加到缓存中。
下面的代码示例将名为 CacheItem1 的项添加到 Cache 对象中:
C#
复制代码
Cache["CacheItem1"] = "Cached Item 1";
Visual Basic
复制代码
Cache("CacheItem1") = "Cached Item 1"
通过使用 Insert 方法将项添加到缓存中
调用 Insert 方法,传递要添加的项的键和值。
下面的代码示例添加名为 CacheItem2 的字符串:
C#
复制代码
Cache.Insert("CacheItem2", "Cached Item 2");
Visual Basic
复制代码
Cache.Insert("CacheItem2", "Cached Item 2")
通过指定依赖项向缓存添加项
调用 Insert 方法,将 CacheDependency 对象的一个实例传递给该方法
下面的代码示例添加名为 CacheItem3 的项,该项依赖于缓存中名为 CacheItem2 的另一个项:
C#
复制代码
string[] dependencies = { "CacheItem2" };Cache.Insert("CacheItem3", "Cached Item 3", new System.Web.Caching.CacheDependency(null, dependencies));
Visual Basic
复制代码
Dim dependencies As String() = {"CacheItem2"}Cache.Insert("CacheItem3", "Cached Item 3", _ New System.Web.Caching.CacheDependency( _ Nothing, dependencies))
下面的代码示例演示将名为 CacheItem4 的项添加到缓存中,并且在名为 XMLFile.xml 的文件上设置文件依赖项:
C#
复制代码
Cache.Insert("CacheItem4", "Cached Item 4", new System.Web.Caching.CacheDependency( Server.MapPath("XMLFile.xml")));
Visual Basic
复制代码
Cache.Insert("CacheItem4", "Cached Item 4", _ New System.Web.Caching.CacheDependency( _ Server.MapPath("XMLFile.xml")))
下面的代码示例演示如何创建多个依赖项。它向缓存中名为 CacheItem1 的另一个项添加键依赖项,向名为 XMLFile.xml 的文件添加文件依赖项。
C#
复制代码
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);
Visual Basic
复制代码
Dim dep1 As CacheDependency = _ New CacheDependency(Server.MapPath("XMLFile.xml"))Dim keyDependencies2 As String() = {"CacheItem1"}Dim dep2 As CacheDependency = _ New System.Web.Caching.CacheDependency(Nothing, _ keyDependencies2)Dim aggDep As AggregateCacheDependency = _ New System.Web.Caching.AggregateCacheDependency()aggDep.Add(dep1)aggDep.Add(dep2)Cache.Insert("CacheItem5", "Cached Item 5", aggDep)
将设有过期策略的项添加到缓存中
调用 Insert 方法,将绝对过期时间或弹性过期时间传递给该方法。
下面的代码示例将有一分钟绝对过期时间的项添加到缓存中:
C#
复制代码
Cache.Insert("CacheItem6", "Cached Item 6", null, DateTime.Now.AddMinutes(1d), System.Web.Caching.Cache.NoSlidingExpiration);
Visual Basic
复制代码
Cache.Insert("CacheItem6", "Cached Item 6", _ Nothing, DateTime.Now.AddMinutes(1.0), _ TimeSpan.Zero)
下面的代码示例将有 10 分钟弹性过期时间的项添加到缓存中:
C#
复制代码
Cache.Insert("CacheItem7", "Cached Item 7", null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 10, 0));
Visual Basic
复制代码
Cache.Insert("CacheItem7", "Cached Item 7", _ Nothing, System.Web.Caching.Cache.NoAbsoluteExpiration, _ New TimeSpan(0, 10, 0))
将设有优先级设置的项添加到缓存中
调用 Insert 方法,从 CacheItemPriority 枚举中指定一个值。
下面的代码示例将优先级值为 High 的项添加到缓存中:
C#
复制代码
Cache.Insert("CacheItem8", "Cached Item 8", null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.High, null);
Visual Basic
复制代码
Cache.Insert("CacheItem8", "Cached Item 8", _ Nothing, System.Web.Caching.Cache.NoAbsoluteExpiration, _ System.Web.Caching.Cache.NoSlidingExpiration, _ System.Web.Caching.CacheItemPriority.High, _ Nothing)