網頁輸出快取作為最簡單的緩衝形式,輸出緩衝只是在記憶體中保留為響應請求而發送的 HTML 的副本。其後再有請求時將提供緩衝的輸出,直到緩衝到期,這樣,效能有可能得到很大的提高(取決於需要多少開銷來建立原始頁面輸出 - 發送緩衝的輸出總是很快,並且比較穩定)。
設定網頁輸出快取可以使用以下兩種方式:一種是使用@ OutputCache指令,另一種是使用網頁輸出快取API。@ OutputCache指令曾經在ASP.NET 1.x中出現過,並在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,表示輸出緩衝可用於所有請求,包括用戶端瀏覽器、Proxy 伺服器或處理請求的伺服器上。需要注意的是,包含在使用者控制項中的@ OutputCache指令不支援此屬性。
Shared
一個布爾值,確定使用者控制項輸出是否可以由多個頁共用。預設值為
false。
NoStore
該屬性定義一個布爾值,用於決定是否阻止敏感資訊的二級儲存。需要注意的是,包含在使用者控制項中的@ OutputCache指令不支援此屬性。將此屬性設定為true等效於在請求期間執行代碼“Response.Cache.SetNoStore();”。
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 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類得到了擴充和發展。主要是增加了一些重要方法,例如,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指令一起使用時,欄位副檔名才有效。如果組合不相容的指令和擴充,則此方法將引發無效參數異常。
樣本
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時整。