ASP.NET 提供三種主要快取形式:頁面快取、使用者控制項輸出快取和快取 API。
頁面輸出快取作為最簡單的快取形式,將已生成的動/靜態頁面全部內容保存在伺服器記憶體中。當再有請求時,系統直接輸出快取中相關資料,直到快取資料過期。此過程中,快取不再經過頁面處理生命週期。這可縮短請求回應時間,提高應用程式效能。顯然,頁面輸出快取適用於不需頻繁更新資料,而佔用大量時間和資源才能編譯生成的頁面。
實現頁面輸出快取,通常有以下兩種方法:
使用 @ OutputCache 指示詞,能實現頁面輸出快取的一般性需求。@ OutputCache 指示詞在 ASP.NET 頁或頁中包含的使用者控制項的標頭宣告。此方式非常方便,只需幾個簡單屬性設定,即可實現頁面輸出快取策略。
該類別主要包含用於設定快取特定 HTTP 標頭的方法和控制 ASP.NET 頁面輸出快取的方法。與 .NET Framework 1.x 中的 HttpCachePolicy 類別相比,.NET Framework 2.0 中的 HttpCachePolicy 類別得到擴充與發展。
使用這兩種方法,可實現下列功能:
使用 ASP.NET,可根據指定 HTTP 標頭值對某頁多個版本進行快取。請求頁時,可指定按傳遞到應用程式的單個標頭、多個標頭或所有標頭進行快取。
A、在 ASP.NET 頁中,在 @ OutputCache 指示詞中包含必要的 Duration 和 VaryByParam 或 VaryByControl 屬性。必須將 Duration 設為大於零的整數。若只想按 HTTP 標頭值快取,必須將 VaryByParam 設為 "None"。
B、在 @ OutputCache 指示詞中,包含 VaryByHeader 屬性,將其值設為作為改變快取內容依據的 HTTP 標頭名稱。
下列範例將頁快取 60 秒,並根據 Accept-Language HTTP 標頭傳遞的值設定要快取的頁版本:
<%@ OutputCache Duration="60" VaryByParam="None" VaryByHeader="Accept-Language" %>
注意:若要根據多個標頭改變快取內容,請以分號 (;) 作為分隔符包含標頭名稱列表。若要根據所有標頭值改變快取內容,請將 VaryByHeader 設為星號 (*)。
A、在頁的 Page_Load 方法中,對頁的 Response 物件的 Cache 屬性呼叫 SetCacheability 和 SetExpires 方法。
B、將 VaryByHeaders 屬性中的 HTTP 標頭值設為 true。
下列程式碼範例示範如何為有不同 Accept-Language HTTP 標頭值的請求,將某頁多個版本快取一分鐘:
protected void Page_Load(object sender, EventArgs e)
{
Response.Cache.SetExpires(DateTime.Now.AddMinutes(1d));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(true);
Response.Cache.VaryByHeaders["Accept-Language"] = true;
}
注意:若要根據多個標頭改變快取內容,需在 VaryByHeaders 屬性中設定多個值。若要根據所有標頭改變快取內容,請將 VaryByHeaders["VaryByUnspecifiedParameters"] 設為 true。