页面输出缓存[转载]
页面输出缓存作为最简单的缓存形式,输出缓存只是在内存中保留为响应请求而发送的HTML的副本。其后再有请求时将提供缓存的输出,直到缓存到期,这样,性能有可能得到很大的提高。
可以用以下几种方式进行页面输出缓存:
以在页或配置文件中以声明方式或者通过编程方式使用缓存 API 指定缓存设置。
根据查询字符串参数值或窗体变量值(控件值)缓存页。必须通过使用VaryByParam属性,显式启用基于这些类型的值的缓存。
下面具体说明实现方式
一、以声明方式设置页的可缓存性
使用@OutputCache指令在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"
%>
属性
Duration:页或用户控件进行缓存的时间(以秒计)。备注:必选属性。如果未包含该属性,将出现分析器错误。
Location:指定输出缓存项的位置,OutputCacheLocation 枚举值之一。默认值为 Any。备注:包含在用户控件(.ascx 文件)中的 @ OutputCache 指令不支持此属性。
CacheProfile:与该页关联的缓存设置的名称。这是可选属性,默认值为空字符 ("")。备注:包含在用户控件(.ascx 文件)中的 @ OutputCache 指令不支持此属性。在页中指定此属性时,属性值必须与Web.Config文件<outputCacheSettings>配置节下面的 outputCacheProfiles 元素中的一个可用项的名称匹配。如果此名称与配置文件项不匹配,将引发异常。
NoStore:一个布尔值,它决定了是否阻止敏感信息的二级存储。备注:包含在用户控件(.ascx 文件)中的 @ OutputCache 指令不支持此属性。将此属性设置为 true 等效于在请求期间执行代码:Response.Cache.SetNoStore();
Shared:一个布尔值,确定用户控件输出是否可以由多个页共享。默认值为 false。备注:包含在 ASP.NET 页(.aspx 文件)中的 @ OutputCache 指令不支持此属性。
SqlDependency:标识一组数据库/表名称对的字符串值,页或控件的输出缓存依赖于这些名称对。需要注意:SqlCacheDependency 类监视输出缓存所依赖的数据库中的表,因此当更新表中的项时,使用基于表的轮询时将从缓存中移除这些项。将通知(在 Microsoft SQL Server 2005 中)与 CommandNotification 值一起使用时,最终将使用 SqlDependency 类向 SQL Server 2005 服务器注册查询通知。备注:SqlDependency 属性的 CommandNotification 值仅在网页 (.aspx) 中有效。用户控件只能将基于表的轮询用于 @ OutputCache 指令。
VaryByCustom:表示自定义输出缓存要求的任意文本。如果赋予该属性的值为 browser,缓存将随浏览器名称和主要版本信息的不同而异。如果输入自定义字符串,则必须在应用程序的 Global.asax 文件中重写 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 页和用户控件上使用 @ OutputCache 指令时,需要该属性或 VaryByParam 属性。
使用Web.Config文件来声明页面缓存的简单示例:
1.设置Web.Config
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="Cache30Seconds" duration="30"
varyByParam="none" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
2.在ASP.NET页面中使用@OutputCache指令
<%@ OutputCache CacheProfile="Cache30Seconds" %>
二、以编程方式设置页的可缓存性
该方法的核心是调用System.Web.HttoCachePolicy。下面展现一个示例,并给出一些常见的方法。
在页的代码中,调用 Response 对象的 Cache 属性的 SetCacheability 方法。
下面的代码将 Cache-Control HTTP 标头设置为 Public。
Response.Cache.SetCacheability(HttpCacheability.Public);
HttpCachePolicy 常用方法
SetExpires:将 Expires HTTP 标头设置为绝对日期和时间。
SetLastModified:将 Last-Modified HTTP 标头设置为提供的 DateTime 值。
SetSlidingExpiration:将缓存过期从绝对时间设置为可调时间。
SetOmitVaryStar:指定在按参数进行区分时,响应是否应该包含 vary:* 标头。
SetCacheability:已重载。设置 Cache-Control HTTP 标头。Cache-Control HTTP 标头控制在网络上缓存文档的方式。