頁面輸出緩存作為最簡單的緩存形式,輸出緩存只是在內存中保留為響應請求而發(fā)送的 HTML 的副本。其后再有請求時將提供緩存的輸出,直到緩存到期,這樣,性能有可能得到很大的提高(取決于需要多少開銷來創(chuàng)建原始頁面輸出 - 發(fā)送緩存的輸出總是很快,并且比較穩(wěn)定)。
設置頁面輸出緩存可以使用以下兩種方式:一種是使用@ OutputCache指令,另一種是使用頁面輸出緩存API。@ OutputCache指令曾經在ASP.NET 1.x中出現(xiàn)過,并在ASP.NET 2.0中得到了繼承和增強。頁面輸出緩存API主要是指HttpCachePolicy類。
@ 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 頁或用戶控件進行緩存的時間(以秒計)。在頁或用戶控件上設置該屬性為來自對象的 HTTP 響應建立了一個過期策略,并將自動緩存頁或用戶控件輸出。Location
用于指定輸出緩存項的位置。其屬性值是OutputCacheLocation枚舉值,它們是Any、Client、Downstream、None、Server和ServerAndClient。默認值是Any,表示輸出緩存可用于所有請求,包括客戶端瀏覽器、代理服務器或處理請求的服務器上。需要注意的是,包含在用戶控件中的@ OutputCache指令不支持此屬性。Shared 一個布爾值,確定用戶控件輸出是否可以由多個頁共享。默認值為 false。NoStore
該屬性定義一個布爾值,用于決定是否阻止敏感信息的二級存儲。需要注意的是,包含在用戶控件中的@ OutputCache指令不支持此屬性。將此屬性設置為true等效于在請求期間執(zhí)行代碼“Response.Cache.SetNoStore();”。SqlDependency 該屬性標識一組數據庫/表名稱對的字符串值,頁或控件的輸出緩存依賴于這些名稱對。需要注意:SqlCacheDependency類監(jiān)視輸出緩存所依賴的數據庫中的表,因此,當更新表中的項時,使用基于表的輪詢將從緩存中移除這些項。當通知(在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標頭列表,用于使輸出緩存發(fā)生變化。當將該屬性設為多標頭時,對于每個指定的標頭,輸出緩存都包含一個請求文檔的不同版本。VaryByHeader屬性在所有HTTP 1.1緩存中啟用緩存項,而不僅限于ASP.NET緩存。用戶控件中的@ OutputCache指令不支持此屬性。VaryByParam 該屬性定義了一個分號分隔的字符串列表,用于使輸出緩存發(fā)生變化。默認情況下,這些字符串與用GET方法屬性發(fā)送的查詢字符串值對應,或與用POST方法發(fā)送的參數對應。當將該屬性設置為多參數時,對于每個指定的參數,輸出緩存都包含一個請求文檔的不同版本??赡艿闹蛋?#8220;none”、“*”和任何有效的查詢字符串或POST參數名稱。值得注意的是,在輸出緩存ASP.NET頁時,該屬性是必需的。它對于用戶控件也是必需的,除非已經在用戶控件的@ OutputCache指令中包含了VaryByControl屬性。如果沒有包含,則會發(fā)生分析器錯誤。如果不需要使緩存內容隨任何指定參數發(fā)生變化,則可將該值設為“none”。如果要使輸出緩存根據所有參數值發(fā)生變化,則將屬性設置為“*”。
示例
<%@ OutputCache Duration="120" VaryByParam="CategoryID;SelectedID"%> 以上代碼設置用戶控件緩存有效期時間是120秒,并且允許使用CategoryID和SelectedID參數來改變緩存。<%@ OutputCache Duration="100" VaryByParam="none"%> 其指示頁面輸出緩存的有效期是100秒,并且頁面不隨任何GET或POST參數改變。在該頁仍被緩存時接收到的請求由緩存數據提供服務。經過100秒后,將從緩存中移除該頁數據,并隨后顯式處理下一個請求并再次緩存頁。<%@ OutputCache Duration="120" VaryByParam="none" VaryByControl="Category" %> 以上代碼設置緩存有效期是120秒,并且頁面不隨任何GET或POST參數改變(即使不使用VaryByParam屬性,但是仍然需要在@ OutputControl指令中顯式聲明該屬性)。如果用戶控件中包含ID屬性為“Category”的服務器控件(例如下拉框控件),那么緩存將根據該控件的變化來存儲用戶控件數據。
使用頁面輸出緩存API
該方法的核心是調用System.Web.HttpCachePolicy。該類主要包含用于設置緩存特定的HTTP標頭的方法和用于控制ASP.NET頁面輸出緩存的方法。與.NET Framework 1.x中的HttpCachePolicy類相比,.NET Framework 2.0中的HttpCachePolicy類得到了擴充和發(fā)展。主要是增加了一些重要方法,例如,SetOmitVarStar方法等。由于HttpCachePolicy類方法眾多,下面簡要說明一些常用方法。
SetExpires方法
用于設置緩存過期的絕對時間。它的參數是一個DataTime類的實例,表示過期的絕對時間。
SetLastModified方法
用于設置頁面的Last-Modified HTTP標頭。Last-Modified HTTP標頭表示頁面上次修改時間,緩存將依靠它來進行計時。如果違反了緩存限制層次結構,此方法將失敗。該方法的參數是一個DataTime類的實例。
SetSlidingExpiration方法
該方法將緩存過期從絕對時間設置為可調時間。其參數是一個布爾值。當參數為true時,Cache-Control HTTP標頭將隨每個響應而更新。此過期模式與相對于當前時間將過期標頭添加到所有輸出集的IIS配置選項相同。當參數為false時,將保留該設置,且任何啟用可調整過期的嘗試都將靜態(tài)失敗。此方法不直接映射到HTTP標頭。它由后續(xù)模塊或輔助請求來設置源服務器緩存策略。
SetOmitVaryStar方法
ASP.NET 2.0新增的方法。用于指定在按參數進行區(qū)分時,響應是否應該包含vary:*標頭。方法參數是一個布爾值,若要指示HttpCachePolicy不對其VaryByHeaders屬性使用*值,則為true;否則為false。
SetCacheability方法
用于設置頁面的Cache-Control HTTP標頭。該標頭用于控制在網絡上緩存文檔的方式。該方法有兩種重載方式,所不同的是參數。一種重載方法的參數是HttpCacheability枚舉值,包括NoCache、Private、Public、Server、ServerAndNoCache和ServerAndPrivate(有關這些枚舉值的定義,可參考MSDN)。另一種方法的參數有兩個,一個參數是HttpCacheability枚舉值,另一個參數是字符串,表示添加到標頭的緩存控制擴展。需要注意的是,僅當與Private或NoCache指令一起使用時,字段擴展名才有效。如果組合不兼容的指令和擴展,則此方法將引發(fā)無效參數異常。
示例
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetExpires(DateTime.Parse("6:00:00PM"));
Response類的Cache屬性用于獲取頁面緩存策略。該屬性的數據類型是HttpCachePolicy??赏ㄟ^調用Response.Cache來獲取HttpCachePolicy實例,進而實現(xiàn)對于當前頁面輸出緩存的設置。如上代碼所示,第一行代碼表示輸出緩存時間是60秒,并且頁面不隨任何GET或POST參數改變,等同于“<%@ OutputCache Duration="60" VaryByParam="none" %>”。第二行代碼設置緩存過期的絕對時間是當日下午6時整。