asp.net缓冲应用
@OutputCache命令
你可以用@OutputCache命令来声明控制资源缓冲的性能。这个命令支持一些属性,其中两个是托管的—Duration和 VaryByParam。Duration属性以秒为单位指定了系统对页面缓冲的时间。VaryByParam属性允许根据GET查询字符串或表单的 POST参数对缓冲的输出结果进行分类。如下声明对页面缓冲一分钟,而不管是什么GET或POST参数:
<%@ OutputCache Duration="60" VaryByParam="None" %>
@OutputCache支持六个属性,它们指定了缓冲的位置、持续时间,以及用来分类页面缓冲的参数。表A列出了这些属性。
表A
由分号隔开的一个字符串列表,代表完全限定的用户控件属性的名称。只被用来缓冲用户控件,而不能被用于ASP.NET页面。
属性 |
描述 |
Duration |
页面或用户控件被缓冲的时间,以秒记。 |
Location |
指定的一个合法的存储页面结果的路径。该属性值从枚举变量OutputCacheLocation中获取,默认为Any。 |
VaryByCustom |
由分号隔开的一个字符串列表,用于根据用户定义字符串的浏览器类型而维护页面的各个不同的缓冲拷贝。 |
VaryByHeader |
由分号隔开的一个HTTP阅读器列表。 |
VaryByParam |
由分号隔开的一个字符串列表,代表查询字符串的值,它们是由GET方法发送的属性或由POST方法发送的参数。 |
VaryByControl |
上面提到过,VaryByParam属性是托管的。如果你忽略它的话,运行时就会抛出异常。VaryByParam属性不允许用空字符串作为其值,因此如果不需以参数分类,就把该属性设置为None。
当一个页面的输出缓冲服务被激活时(即已经使用了@OutputCache命令),Duration属性指出了ASP.NET系统将对该页面以HTML编译的版本缓冲的时间。以后如果有对该相同页面或对该页面已存在的参数化版本的请求,系统将会返回缓冲的该页面的句柄。
为一个页面设置Duration属性后,ASP.NET运行时会为HTTP响应生成一个过期策略。输出结果只会被缓冲指定的时间(秒)。在这期间,所有命中缓冲页面的请求都由输出缓冲模块处理,而并不通过ASP.NET pipeline。
输出缓冲可以存在于不同的位置,既可以在产生请求的客户端也可以在服务器端。它还可以在这中间的代理服务器上。表B总结了其可能存在的位置。
表B
位置 |
缓冲控制 |
描述 |
Any |
Public |
HTTP标记Expires是根据由@outputCache命令设置的持续时间来设定。一个新的项目被放进ASP.NET Cache对象中来表示该页面的输出结果。 |
Client |
Private |
HTTP标记Expires是根据由@outputCache命令设置的持续时间来设定。ASP.NET Cache对象没有加入任何项目 |
DownStream |
Public |
HTTP标记Expires是根据由@outputCache命令设置的持续时间来设定。ASP.NET Cache对象没有加入任何项目。 |
None |
No-Cache |
HTTP标记Expires没有定义。Pragma标记被设置为No-Cache。ASP.NET Cache对象没有加入任何项目。 |
Server |
No-Cache |
HTTP标记Expires没有定义。Pragma标记被设置为No-Cache。一个新的项目被放进ASP.NET Cache对象中来表示该页面的输出结果。 |
大多数的浏览器和中间代理服务器会使用任何过期信息,这些信息由Web服务器嵌入到生成的HTML页面中。有两个HTTP 1.1标记和页面缓冲有关:Expires和Cache-Control。
HTTP Expire标记被用来指定什么时候客户端应该更新服务器上的某个页面。在这之前,任何向浏览器发出的对该资源的请求都会由本地客户端缓存响应,而不必连接到服务器上。
当指定并没有设置为No-Cache时,HTTP 1.1 Cache-Control一般会采用public或private值。private值使得只有浏览器才能缓存页面,而代理服务器不行。Cache-Control是HTTP 1.1规范的一部分,只有IE 5.5或以上版本才支持。
如果你看看由ASP.NET在允许输出缓冲条件下生成的HTTP标记,你会注意到有时用到了Pragma标记,特别是当缓冲被设置成Server 时。在这样的情况下,标记被指定为No-Cache,这意味着在浏览器和代理服务器中都不能使用客户端缓冲。结果是,任何对该页面的访问都要连接到服务 器。准确地说,将Pragma标记设置为No-Cache只禁止了经由HTTP通道的缓冲。如果通过非安全通道来访问页面,它实际上被缓存了但是被标记为 过期的。