1. 页面输出缓存是最为简单的缓存机制,该机制将整个ASP.NET页面内容保存在服务器内存中。当用户请求该页面时,系统从内存中输出相关数据,直到缓存数据过期。在这个过程中,缓存内容直接发送给用户,而不必再次经过页面处理生命周期。通常情况下,页面输出缓存对于那些包含不需要经常修改内容的,但需要大量处理才能编译完成的页面特别有用。需要读者注意的是,页面输出缓存是将页面全部内容都保存在内存中,并用于完成客户端请求。  
  2.  
  3. 在ASP.NET中页面缓存的使用方法非常的简单,只需要在aspx页的顶部加这样一句声明即可:  
  4.  
  5. <%@ OutputCache Duration="60" VaryByParam="none" %>  
  6.  
  7. Duration    
  8.  
  9. 缓存的时间(秒)。这是必选属性。如果未包含该属性,将出现分析器错误。  
  10.  
  11. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="CacheWebApp._16_4_3.WebForm1" %>  
  12.  
  13. <%@ OutputCache Duration="60" VaryByParam="none" %>  
  14.  
  15. <html xmlns="http://www.w3.org/1999/xhtml" >  
  16.  
  17. <head runat="server">  
  18.  
  19.     <title>页面缓存示例</title>  
  20.  
  21. </head>  
  22.  
  23. <body>  
  24.  
  25.     <form id="form1" runat="server">  
  26.  
  27.     <div>  
  28.  
  29.         <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>  
  30.  
  31.     </div>  
  32.  
  33.     </form>  
  34.  
  35. </body>  
  36.  
  37.    
  38.  
  39. </html>  
  40.  
  41. 后台代码:  
  42.        protected void Page_Load(object sender, EventArgs e)  
  43.         {  
  44.             if (!IsPostBack)  
  45.             {  
  46.                Label1.Text = DateTime.Now.ToString();  
  47.             }  
  48.         }  
  49.  
  50.     如果不加<%@ OutputCache Duration="60" VaryByParam="none" %>,每次刷新页面上的时间每次都是在变。而加了缓存声明以后,每次刷新页面的时间并不变化,60秒后才变化一次,说明数据被缓存了60秒。  
  51. VaryByParam  
  52.  
  53. 是指页面根据使用 POST 或 GET 发送的名称/值对(参数)来更新缓存的内容,多个参数用分号隔开。如果不希望根据任何参数来改变缓存内容,请将值设置为 none。如果希望通过所有的参数值改变都更新缓存,请将属性设置为星号 (*)。  
  54.  
  55. 例如: http://localhost:1165/16-4-3/WebForm1.aspx?p=1  
  56. 则可以在WebForm1.aspx页面头部声明缓存:<%@ OutputCache Duration="60" VaryByParam="p" %>  
  57.  
  58. 以上代码设置页面缓存时间是60秒,并根据p参数的值来更新缓存,即p的值发生变化才更新缓存。  
  59.  
  60. 如果一直是WebForm1.aspx?p=1访问该页,则页面会缓存当前数据,当p=2时又会执行后台代码更新缓存内容。  
  61.  
  62. 如果有多个参数时,如:http://localhost:1165/16-4-3/WebForm1.aspx?p=1&n=1  
  63.  
  64. 可以这样声明:<%@ OutputCache Duration="60" VaryByParam="p;n" %>   
  65.  
  66. 除此之外,@OutputCache 还有一些其他的属性。@OutputCache指令中的属性参数描述如下:  
  67.  
  68. <%@ OutputCache Duration="#ofseconds" 
  69.  
  70.    Location="Any | Client | Downstream | Server | None |  
  71.  
  72.      ServerAndClient "  
  73.  
  74.    Shared="True | False" 
  75.  
  76.    VaryByControl="controlname" 
  77.  
  78.    VaryByCustom="browser | customstring" 
  79.  
  80.    VaryByHeader="headers" 
  81.  
  82.    VaryByParam="parametername" 
  83.  
  84.    CacheProfile="cache profile name | ''" 
  85.  
  86.    NoStore="true | false" 
  87.  
  88.    SqlDependency="database/table name pair | CommandNotification" 
  89.  
  90. %>  
  91.  
  92. CacheProfile  
  93.  
  94. 用于调用Web.config配置文件中设置的缓存时间。这是可选属性,默认值为空字符 ("")。  
  95.  
  96. 例如:  
  97.  
  98. 在Web.config中加入配置:  
  99.  
  100. <system.web>  
  101.  
  102.     <caching>  
  103.  
  104.         <outputCacheSettings>  
  105.  
  106.             <outputCacheProfiles>  
  107.  
  108.                 <add name="CacheTest" duration="50" />  
  109.  
  110.             </outputCacheProfiles>  
  111.  
  112.         </outputCacheSettings>  
  113.  
  114. </caching>  
  115.  
  116. </system.web>  
  117.  
  118. 页面中声明:  
  119.  
  120. <%@ OutputCache CacheProfile="CacheTest"  VaryByParam="none" %>  
  121.  
  122. 注意:  
  123.  
  124. 包含在用户控件(.ascx 文件)中的 @ OutputCache 指令不支持此属性。在页中指定此属性时,属性值必须与 outputCacheSettings 节下面的 outputCacheProfiles 元素中的一个可用项的名称匹配。如果此名称与配置文件项不匹配,将引发异常。  
  125.  
  126. 如果每个页面的缓存时间相同,则不需要每个页面设置,而是通过统一一个地方控制,这样就可以更好的统一控制所有页面的缓存时间。如果想改变缓存时间,只需要改一下web.config的配置信息即可,而不用每个页面去修改。  
  127.  
  128. VaryByControl  
  129.  
  130. 通过用户控件文件中包含的服务器控件来改变缓存(值是控件ID,多控件用分号隔开)。  
  131.  
  132. 在 ASP.NET 页和用户控件上使用 @ OutputCache 指令时,需要该属性或 VaryByParam 属性。  
  133.  
  134. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="CacheWebApp._16_4_3.WebForm2" %>  
  135.  
  136. <%@ OutputCache Duration="60" VaryByParam="none" VaryByControl="DropDownList1" %>  
  137.  
  138. <html xmlns="http://www.w3.org/1999/xhtml" >  
  139.  
  140. <head runat="server">  
  141.  
  142.     <title>根据控件页面缓存</title>  
  143. </head>  
  144. <body>  
  145.     <form id="form1" runat="server">  
  146.     <div>  
  147.          <%=DateTime.Now %>         
  148.         <br>  
  149.     <asp:DropDownList ID="DropDownList1" runat="server">  
  150.         <asp:ListItem>beijing</asp:ListItem>  
  151.         <asp:ListItem>shanghai</asp:ListItem>  
  152.         <asp:ListItem>guangzhou</asp:ListItem>  
  153.         </asp:DropDownList>  
  154.         <asp:Button ID="Button1" runat="server" Text="提交" />  
  155.     </div>  
  156.     </form>  
  157. </body>  
  158.  
  159. </html>  
  160.  
  161. 以上代码设置缓存有效期是60秒,并且页面不随任何GET或POST参数改变(即使不使用VaryByParam属性,但是仍然需要在@ OutputControl指令中显式声明该属性)。如果用户控件中包含ID属性为“DropDownList1”的服务器控件(例如下拉框控件),那么缓存将根据该控件的变化来更新页面数据。  
  162.  
  163. 页面输出缓存API  
  164.  
  165. Response类的Cache属性用于获取页面缓存策略。该方式的核心是调用System.Web.HttpCachePolicy。该类主要包含用于设置缓存特定的HTTP标头的方法和用于控制ASP.NET页面输出缓存的方法。与.NET Framework 1.x中的HttpCachePolicy类相比,.NET Framework 2.0中的HttpCachePolicy类得到了扩充和发展。主要是增加了一些重要方法,例如,SetOmitVarStar方法等。由于HttpCachePolicy类方法众多,下面简要说明几个常用方法。  
  166.  
  167. SetExpires方法  
  168.  
  169. 用于设置缓存过期的绝对时间。它的参数是一个DataTime类的实例,表示过期的绝对时间。  
  170.  
  171.         protected void Page_Load(object sender, EventArgs e)  
  172.         {  
  173.             // 通过API设置缓存  
  174.  
  175.             //相当于@OutputCache指令中的Duration属性  
  176.  
  177.             Response.Cache.SetExpires(DateTime.Now.AddSeconds(10));  
  178.  
  179.             Response.Cache.SetExpires(DateTime.Parse("6:00:00PM"));  
  180.  
  181.         }  
  182.  
  183. 如上代码,第一行代码表示输出缓存时间是60秒,并且页面不随任何GET或POST参数改变,等同于“<%@ OutputCache Duration="60" VaryByParam="none" %>”。第二行代码设置缓存过期的绝对时间是当日下午6时整。  
  184.  
  185. SetLastModified方法  
  186.  
  187. 用于设置页面的Last-Modified HTTP标头。Last-Modified HTTP标头表示页面上次修改时间,缓存将依靠它来进行计时。如果违反了缓存限制层次结构,此方法将失败。该方法的参数是一个DataTime类的实例。  
  188.  
  189. SetSlidingExpiration方法  
  190.  
  191. 该方法将缓存过期从绝对时间设置为可调时间。其参数是一个布尔值。当参数为true时,Cache-Control HTTP标头将随每个响应而更新。此过期模式与相对于当前时间将过期标头添加到所有输出集的IIS配置选项相同。当参数为False时,将保留该设置,且任何启用可调整过期的尝试都将静态失败。此方法不直接映射到HTTP标头。它由后续模块或辅助请求来设置源服务器缓存策略。  
  192.  
  193. SetOmitVaryStar方法  
  194.  
  195. ASP.NET 2.0新增的方法。用于指定在按参数进行区分时,响应是否应该包含vary:*标头。方法参数是一个布尔值,若要指示HttpCachePolicy不对其VaryByHeaders属性使用*值,则为true;否则为false。  
  196.  
  197. SetCacheability方法  
  198.  
  199.     用于设置页面的Cache-Control HTTP标头。该标头用于控制在网络上缓存文档的方式。该方法有两种重载方式,所不同的是参数。一种重载方法的参数是HttpCacheability枚举值,包括NoCache、Private、Public、Server、ServerAndNoCache和ServerAndPrivate(有关这些枚举值的定义,可参考MSDN)。另一种方法的参数有两个,一个参数是HttpCacheability枚举值,另一个参数是字符串,表示添加到标头的缓存控制扩展。需要注意的是,仅当与Private或NoCache指令一起使用时,字段扩展名才有效。如果组合不兼容的指令和扩展,则此方法将引发无效参数异常。