頁面輸出緩存

 頁面全部內容保存在服務器內存中。當再有請求時,系統將緩存中的相關數據直接輸出,直到緩存數據過期。這個過程中,緩存不需要再次經過頁面處理生命週期。這樣可以縮短請求響應時間,提高應用程序性能。很顯然,頁面輸出緩存適用於不需要頻繁更新數據,而佔用大量時間和資源才能編譯生成的頁面。對於那些數據經常更新的頁面,則不適用。默認情況下,ASP.NET 2.0啓用了頁面輸出緩存功能,但並不緩存任何響應的輸出。開發人員必須通過設置,使得某些頁面的響應成爲緩存的一部分。   設置頁面輸出緩存可以使用以下兩種方式:一種是使用@ OutputCache指令,另一種是使用頁面輸出緩存API。@ OutputCache指令曾經在ASP.NET 1.x中出現過,並在ASP.NET 2.0中得到了繼承和增強。頁面輸出緩存API主要是指HttpCachePolicy類。   使用@ OutputCache指令   使用@ OutputCache指令,能夠實現對頁面輸出緩存的一般性需要。@ OutputCache指令在ASP.NET頁或者頁中包含的用戶控件的頭部聲明。這種方式非常方便,只需幾個簡單的屬性設置,就能夠實現頁面的輸出緩存策略。@ OutputCache指令聲明代碼如下。 @ OutputCache指令代碼 <%@ OutputCache CacheProfile=" " NoStore="True | False" Duration="#ofseconds" Shared="True | False" Location="Any | Client | Downstream | Server | None | ServerandClient " SqlDependency="database/table name pair | CommandNotification " VaryByControl="controlname" VaryByCustom="browser | customstring" VaryByHeader="headers" VaryByParam="parametername" %>   如上所示,在@ OutputCache指令中,共包括10個屬性,它們是CacheProfile、NoStore、Duration、Shared、Location、SqlDependency、VaryByControl、VaryByCustom、VaryByHeader和VaryByParam。這些屬性將對緩存時間、緩存項的位置、SQL數據緩存依賴等各方面進行設置。下面簡要介紹以上屬性的基本概念。   * CacheProfile   用於定義與該頁關聯的緩存設置的名稱。是可選屬性,默認值爲空字符("")。需要注意的是,包含在用戶控件中的@ OutputCache指令不支持此屬性。在頁面中指定此屬性時,屬性值必須與Web.config文件<outputCacheSettings>配置節下的outputCacheProfiles元素中的一個可用項的名稱匹配。如果此名稱與配置文件項不匹配,將引發異常。   * NoStore   該屬性定義一個布爾值,用於決定是否阻止敏感信息的二級存儲。需要注意的是,包含在用戶控件中的@ OutputCache指令不支持此屬性。將此屬性設置爲true等效於在請求期間執行代碼“Response.Cache.SetNoStore();”。   * Duration   用於設置頁面或者用戶控件緩存的時間。單位是秒。通過設置該屬性,能夠爲來自對象的HTTP響應建立了一個過期策略,並將自動緩存頁或用戶控件輸出。需要注意的是,Duration屬性是必需的,否則將會引起分析器錯誤。   * Shared   該屬性定義一個布爾值,用於確定用戶控件輸出是否可以由多個頁共享。默認值爲false。注意,包含在ASP.NET頁中的@ OutputCache指令不支持此屬性。   * Location   用於指定輸出緩存項的位置。其屬性值是OutputCacheLocation枚舉值,它們是Any、Client、Downstream、None、Server和ServerAndClient。默認值是Any,表示輸出緩存可用於所有請求,包括客戶端瀏覽器、代理服務器或處理請求的服務器上。需要注意的是,包含在用戶控件中的@ OutputCache指令不支持此屬性。   * SqlDependency   該屬性標識一組數據庫/表名稱對的字符串值,頁或控件的輸出緩存依賴於這些名稱對。需要注意:SqlCacheDependency類監視輸出緩存所依賴的數據庫中的表,因此,當更新表中的項時,使用基於表的輪詢將從緩存中移除這些項。當通知(在SQL Server 2005中)與CommandNotification值一起使用時,最終將使用SqlDependency類向SQL Server 2005服務器註冊查詢通知。另外,SqlDependency屬性的CommandNotification值僅在ASP.NET頁中有效。控件只能將基於表的輪詢用於@ OutputCache指令。   * VaryByControl   該屬性使用一個分號分隔的字符串列表來更改用戶控件的輸出緩存。這些字符串代表在用戶控件中聲明的ASP.NET服務器控件的ID屬性值。除非已經包含了VaryByParam屬性,否則在@ OutputCache指令中,該屬性是必需的。   * VaryByCustom   用於自定義輸出緩存要求的任意文本。如果賦予該屬性值是browser,緩存將隨瀏覽器名稱和主要版本信息的不同而異。如果輸入了自定義字符串,則必須在應用程序的Global.asax文件中重寫HttpApplication.GetVaryByCustomString方法。   * VaryByHeader   該屬性中包含由分號分隔的HTTP標頭列表,用於使輸出緩存發生變化。當將該屬性設爲多標頭時,對於每個指定的標頭,輸出緩存都包含一個請求文檔的不同版本。VaryByHeader屬性在所有HTTP 1.1緩存中啓用緩存項,而不僅限於ASP.NET緩存。用戶控件中的@ OutputCache指令不支持此屬性。   * VaryByParam   該屬性定義了一個分號分隔的字符串列表,用於使輸出緩存發生變化。默認情況下,這些字符串與用GET方法屬性發送的查詢字符串值對應,或與用POST方法發送的參數對應。當將該屬性設置爲多參數時,對於每個指定的參數,輸出緩存都包含一個請求文檔的不同版本。可能的值包括“none”、“*”和任何有效的查詢字符串或POST參數名稱。值得注意的是,在輸出緩存ASP.NET頁時,該屬性是必需的。它對於用戶控件也是必需的,除非已經在用戶控件的@ OutputCache指令中包含了VaryByControl屬性。如果沒有包含,則會發生分析器錯誤。如果不需要使緩存內容隨任何指定參數發生變化,則可將該值設爲“none”。如果要使輸出緩存根據所有參數值發生變化,則將屬性設置爲“*”。   下面列舉了兩個使用@OutputCache指令的示例代碼。 使用@ OutputCache的示例代碼1 <%@ OutputCache Duration="100" VaryByParam="none"%>   以上示例是@ OutputCache指令的基本應用,其指示頁面輸出緩存的有效期是100秒,並且頁面不隨任何GET或POST參數改變。在該頁仍被緩存時接收到的請求由緩存數據提供服務。經過100秒後,將從緩存中移除該頁數據,並隨後顯式處理下一個請求並再次緩存頁。 使用@ OutputCache的示例代碼2 <%@ OutputCache Duration="100" VaryByParam="location;firstname" %>

  以上@ OutputCache指令設置頁面輸出緩存的有效期是100秒,並且根據查詢字符串參數location或者firstname來設置輸出緩存。例如,假設客戶端請求是“http://localhost/default.aspx?location=beijing”,那麼該頁面將被作爲緩存處理。

  使用頁面輸出緩存API   上文介紹了使用@ OutputCache指令實現對於輸出緩存的各項設置。這種方法簡單易行,深得開發人員青睞。另外,ASP.NET 2.0還從ASP.NET 1.x中繼承和擴展了一種使用輸出緩存API來編程設置頁面輸出緩存的方法。該方法的核心是調用System.Web.HttpCachePolicy。該類主要包含用於設置緩存特定的HTTP標頭的方法和用於控制ASP.NET頁面輸出緩存的方法。與.NET Framework 1.x中的HttpCachePolicy類相比,.NET Framework 2.0中的HttpCachePolicy類得到了擴充和發展。主要是增加了一些重要方法,例如,SetOmitVarStar方法等。由於HttpCachePolicy類方法衆多,下面簡要說明一些常用方法。   * SetExpires方法   用於設置緩存過期的絕對時間。它的參數是一個DataTime類的實例,表示過期的絕對時間。   * SetLastModified方法   用於設置頁面的Last-Modified HTTP標頭。Last-Modified HTTP標頭表示頁面上次修改時間,緩存將依靠它來進行計時。如果違反了緩存限制層次結構,此方法將失敗。該方法的參數是一個DataTime類的實例。   * SetSlidingExpiration方法   該方法將緩存過期從絕對時間設置爲可調時間。其參數是一個布爾值。當參數爲true時,Cache-Control HTTP標頭將隨每個響應而更新。此過期模式與相對於當前時間將過期標頭添加到所有輸出集的IIS配置選項相同。當參數爲false時,將保留該設置,且任何啓用可調整過期的嘗試都將靜態失敗。此方法不直接映射到HTTP標頭。它由後續模塊或輔助請求來設置源服務器緩存策略。   * SetOmitVaryStar方法   ASP.NET 2.0新增的方法。用於指定在按參數進行區分時,響應是否應該包含vary:*標頭。方法參數是一個布爾值,若要指示HttpCachePolicy不對其VaryByHeaders屬性使用*值,則爲true;否則爲false。   * SetCacheability方法   用於設置頁面的Cache-Control HTTP標頭。該標頭用於控制在網絡上緩存文檔的方式。該方法有兩種重載方式,所不同的是參數。一種重載方法的參數是HttpCacheability枚舉值,包括NoCache、Private、Public、Server、ServerAndNoCache和ServerAndPrivate(有關這些枚舉值的定義,可參考MSDN)。另一種方法的參數有兩個,一個參數是HttpCacheability枚舉值,另一個參數是字符串,表示添加到標頭的緩存控制擴展。需要注意的是,僅當與Private或NoCache指令一起使用時,字段擴展名纔有效。如果組合不兼容的指令和擴展,則此方法將引發無效參數異常。   下面舉例說明頁面緩存API的HttpCachePolicy類的使用方法。 HttpCachePolicy類示例源代碼 Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)); Response.Cache.SetExpires(DateTime.Parse("6:00:00PM"));   Response類的Cache屬性用於獲取頁面緩存策略。該屬性的數據類型是HttpCachePolicy。可通過調用Response.Cache來獲取HttpCachePolicy實例,進而實現對於當前頁面輸出緩存的設置。如上代碼所示,第一行代碼表示輸出緩存時間是60秒,並且頁面不隨任何GET或POST參數改變,等同於“<%@ OutputCache Duration="60" VaryByParam="none" %>”。第二行代碼設置緩存過期的絕對時間是當日下午6時整。

  頁面輸出緩存應用   以上兩小節分別介紹了使用@ OutputCache指令和API設置頁面輸出緩存功能的內容。實際上,兩種方法各有優點,使用@ OutputCache指令方法比較簡潔,但靈活性較差。使用API方法,能夠在運行時動態地修改緩存配置,處理更多的複雜需求。本節將利用這些知識,實現一個簡單的頁面輸出緩存應用的示例,其中既涉及@ OutputCache指令應用,又涉及頁面輸出緩存API。示例效果如圖12-1和圖12-2所示。 圖1 停止緩存的效果圖 圖12-2 執行緩存的效果圖   如圖1所示,應用程序初始顯示的是停止執行緩存的時間。當用戶刷新頁面(URL地址是http://localhost:5159/Code%2012-1/Default.aspx,其中5159是服務器臨時端口號)時,時間值將隨時變化,以便顯示當前的最新時間。如圖12-2所示,單擊“緩存時間”超鏈接後,頁面重定向到http://localhost:5159/Code%2012-1/Default.aspx?location=beijing。這時,頁面顯示的時間被緩存,數據過期時間爲5秒。如果不斷地刷新該頁,那麼每隔5秒鐘時間值才變化一次。   本節示例存在兩個關鍵點。一是在運行時實現停止緩存,二是配置@ OutputCache指令。這兩點都已經在應用程序Default.aspx文件中予以實現,下面列舉了該文件源代碼。 Default.aspx文件源代碼 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ OutputCache Duration="5" VaryByParam="location" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <script language="C# " runat="server"> void Page_Load(object sender, EventArgs e) { //設置僅將緩存數據存儲在服務器上 Response.Cache.SetCacheability(HttpCacheability.Server); string temp_location = Request.QueryString["location"]; //如果location爲空則不緩存否則根據@ OutputCache指令聲明執行緩存 if (temp_location == null) { //停止當前響應的所有服務器緩存 Response.Cache.SetNoServerCaching(); Label1.Text = "停止緩存的時間" + DateTime.Now.ToString(); } else { Label1.Text = "設置了緩存的時間" + DateTime.Now.ToString(); } } </script> <head id="Head1" runat="server"> <title>示例12-1</title> <link id="InstanceStyle" href="StyleSheet.css" type="text/css" rel="stylesheet" /> </head> <body> <form id="form1" runat="server"> <div> <fieldset style="width: 240px"> <legend class="mainTitle">設置頁面輸出緩存</legend> <br /> <center><asp:Label ID="Label1" runat="server" CssClass="commonText"></asp:Label></center> <br /> <a href="Default.aspx?location=beijing" class="littleMainTitle" >緩存時間</a><br /> </fieldset> </div> </form> </body> </html>   如上粗體代碼所示,代碼頭部的@ OutputCache指令設置了Duration和VaryByParam屬性,其指示數據過期時間爲5秒。同時,緩存根據參數location發生變化。另外,代碼還實現了Page_Load事件處理程序。在該程序中,首先,使用SetCacheability方法設置數據緩存必須存儲在服務器上,然後,獲取QueryString的location參數值,最後,根據location參數值進行判斷。如果location參數值爲空,則調用SetNoServerCaching方法停止當前響應的所有服務器緩存,並顯示當前時間值。雖然@ OutputCache指令配置了頁面輸出緩存,但是,不會執行頁面輸出緩存功能。如果location參數值不爲空,則直接顯示當前時間值。在這種情況下,將執行@ OutputCache指令的配置內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章