且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

ASP.NET 缓存(1)

更新时间:2022-09-28 21:52:10

ASP.NET有两种缓存类型。

输出缓存:这是最简单的缓存类型。存储了要发到客户端的HTML页面。下一个客户请求这页的时候,这页不会再被运行,而是从缓存中自动的直接发送给客户。

数据缓存:这类缓存在你的代码中体现,要使用数据缓存,你存储了重要的信息,这些信息的重建很费时间。其他页面可以使用这个已经存在的数据。数据缓存在概念上和使用应用程序状态相同。但是它更加的服务器友好。因为当它变的太大以至于影响性能,它可以自动的从缓存中删除。它页可以设置过期时间。

有两个特别的缓存基于上面的模型

片段缓存:这是一个输出缓存的特殊类型,它不是缓存整个html页面,而是允许你缓存部分页面。片段缓存的工作原理是通过存储和显式用户控件的HTML输出。

数据源缓存:这个缓存内建在数据源控件,包括SqlDataSource, ObjectDataSource, 和 XmlDataSource。从技术角度来说,数据源缓存使用数据缓存。不同点是你不需要显式的处理,你只需要配置恰当的属性,数据源控件会管理缓存的存储和读取。


输出缓存的一个例子

新建一个空的页面,在pageload方法里写这样的代码

  Response.Write(DateTime.Now.ToString());

这样的话每次打开这个页面都是会打印出最新的时间。

然后在aspx页面头上,添加@output指令。

<%@ OutputCache Duration="20" VaryByParam="None" %>此句的目的就是把该页面缓存20秒。在20秒内,你打开该页面,后台代码根本不会被运行。服务器直接吧这个页面的html代码发送给客户端。(调试状态下,在pageload上设置断点,在缓冲期间,这个断点不会被触发)。

当重新编译缓存页面,ASP.net将自动的删除缓存中的页。这就避免了由于旧页面导致的问题。有时你希望在测试自己的应用程序的时候禁用缓存,不然的话,你可能在监视变量,断点,调式的时候会有问题,因为如果缓存页还存在的时候,你的代码不会被执行。

@ OutputCache指令中的部分参数如下:

详细可参阅msdn:http://msdn.microsoft.com/zh-cn/library/hdxfb6cy(v=VS.100).aspx

 <%@ OutputCache Duration="#ofseconds"

   Location="Any | Client | Downstream | Server | None |       ServerAndClient "
   Shared="True | False"
   VaryByControl="controlname"
   VaryByCustom="browser | customstring"
   VaryByHeader="headers"
   VaryByParam="parametername" 
   VaryByContentEncoding="encodings"
   CacheProfile="cache profile name | ''"
   NoStore="true | false"
   SqlDependency="database/table name pair | CommandNotification"
   ProviderName="Provider Name"  
%>

 

 

 

VaryByParam

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

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

 

 

当你把outputcache指令的属性VaryByParam设置为*

<%@ OutputCache Duration="20" VaryByParam="*" %>

当你用query string请求一个页,asp.net会检查这个query string。如果这个string和先前的一样,并且这页的缓存副本也存在,那么这个缓存则会被重复使用。否则的,会将这页单独的缓存

为了更好的了解这个流程,看下列的请求:

1,你请求一个page,没用query string,得到一个A页面的副本

2,你请求这个page,使用的参数ProductID=1,得到一个B页面的副本

3,另一个用户请求该页,使用的参数ProductID=2,得到了C页面的一个副本

4,又一个用户请求该page,使用ProductID=1,此时B页的缓存还没过期,所以从缓存中发送给用户。

5,这个用户然后请求这个page,没用使用参数,此时如果A页面的缓存没过期,从缓存中发给用户。

<%@ OutputCache Duration="20" VaryByParam="ProductID" %>

如果使用ProductID参数,则独立的缓存只针对这个参数,对于别的参数,ASP.net会忽略,他们都使用同一个缓存。
















本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/546004,如需转载请自行联系原作者