使用Cache对象可以根据几个不同的依赖性,来存储和禁用高速缓存中的数据项。在ASP.NET 1.0/1.1中,只有如下依赖性:
基于文件的依赖性
基于键的依赖性
基于时间的依赖性
在使用Cache对象给高速缓存插入数据项时,用Insert方法设置依赖性,如下面的示例所示:
Duration属性定义了页面在高速缓存中的保存时间(秒)。VaryByParam属性确定高速缓存页面输出的版本。根据所需要的HTTP-POST或HTTP-GET响应可以生成不同的响应。除了OutputCache指令的属性之外,ASP.NET还包含VaryByHeader、VaryByCustom、VaryByControl和Location属性。另外,Shared属性也会影响UserControl,如后面所述。
ASP.NET中的高速缓存实现为一个HttpModule,它通过ASP.NET辅助进程监听所有HttpRequest。OutputCacheModule监听应用程序的ResolveRequestCache和UpdateRequest Cache事件,处理高速缓存的请求和失败,返回高速缓存的HTML,如果需要,绕过页面处理程序。
1. VaryByParam属性
VaryByParam属性可以指定哪些QueryString参数会高速缓存页面的新版本:
Cache.Insert("DSN", connectionString, _ |
在所引用的数据项发生变化时使用依赖性,就从内存中删除了该数据项的高速缓存。
高速缓存依赖性在ASP.NET 2.0中进行了改进,添加了AggregateCacheDependency类、可扩展的CacheDependency类,还可以创建定制的CacheDependency类。详见下面的内容。
1. AggregateCacheDependency类
AggregateCacheDependency类类似于CacheDependency类,但它可以使用不同类型的依赖性,建立与高速缓存中的数据项的关联。例如,如果XML文件中有一个高速缓存的数据项,还从SQL数据库表中获得了信息,就可以创建一个AggregateCacheDependency,其中为每个子依赖性插入一个CacheDependency对象。为此,要调用Cache.Insert,添加AggregateCacheDependency实例,如下所示:
Dim agg as new AggregateCacheDependency() |
注意,要和不同类型的CacheDependency类一起使用。如果只想给一个高速缓存的数据项与多个文件建立关联,可以使用CacheDependency的一个重载版本,如下所示:
VB |
AggregateCacheDependency类支持扩展以前的密封类CacheDependency,可以使用这个新特性创建定制的CacheDependency。
2. 非密封的CacheDependency类
在ASP.NET 2.0中,高速缓存的一个重大变化是重新修订了CacheDependency类,它现在是不密封的(即可以重写)。现在可以创建继承于CacheDependency的类,建立更精细的依赖性,而不限于过去的Time、Key和File依赖性。
在创建自己的高速缓存依赖性时,可以为Web服务数据、仅用于午夜的依赖性和文件中的文本字符串变化等添加过程。我们创建的依赖性没有任何限制。CacheDependency类的非密封性允许指定高速缓存中的数据项何时需要禁用。
有了CacheDependency类的非密封性,ASP.NET小组建立了一个新的SQL Server高速缓存依赖性:SqlCacheDependency。SqlCacheDependency是ASP.NET1.0/1.1开发人员最需要的高速缓存功能。在高速缓存因底层SQL Server的表发生变化而无效时,我们会立即知道。
CacheDependency类现在不是密封的,所以可以派生出定制的CacheDependencies类,如下一节所述。