系統快取全解析2:頁面輸出快取
頁面輸出快取是最為簡單的快取機制,該機制將整個ASP.NET頁面內容儲存在伺服器記憶體中。當使用者請求該頁面時,系統從記憶體中輸出相關資料,直到快取資料過期。在這個過程中,快取內容直接傳送給使用者,而不必再次經過頁面處理生命週期。通常情況下,頁面輸出快取對於那些包含不需要經常修改內容的,但需要大量處理才能編譯完成的頁面特別有用。需要讀者注意的是,頁面輸出快取是將頁面全部內容都儲存在記憶體中,並用於完成客戶端請求。
在ASP.NET中頁面快取的使用方法非常的簡單,只需要在aspx頁的頂部加這樣一句宣告即可:
@ OutputCache Duration="60" VaryByParam="none" %> |
Duration
快取的時間(秒)。這是必選屬性。如果未包含該屬性,將出現分析器錯誤。
@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs"Inherits="CacheWebApp._16_4_3.WebForm1" %> @ OutputCache Duration="60" VaryByParam="none" %> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>頁面快取示例title> head> <body> <form id="form1" runat="server"> <div> <asp:Label ID="Label1" runat="server" Text="Label">asp:Label> div> form> body>
html>
|
後臺程式碼:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Label1.Text = DateTime.Now.ToString(); }
} |
如果不加@ OutputCache Duration="60" VaryByParam="none" %>,每次重新整理頁面上的時間每次都是在變。而加了快取宣告以後,每次重新整理頁面的時間並不變化,60秒後才變化一次,說明資料被快取了60秒。
VaryByParam
是指頁面根據使用 POST 或 GET 傳送的名稱/值對(引數)來更新快取的內容,多個引數用分號隔開。如果不希望根據任何引數來改變快取內容,請將值設定為 none。如果希望通過所有的引數值改變都更新快取,請將屬性設定為星號 (*)。
例如: http://localhost:1165/16-4-3/WebForm1.aspx?p=1
則可以在WebForm1.aspx頁面頭部宣告快取:@ OutputCache Duration="60" VaryByParam="p" %>
以上程式碼設定頁面快取時間是60秒,並根據p引數的值來更新快取,即p的值發生變化才更新快取。
如果一直是WebForm1.aspx?p=1訪問該頁,則頁面會快取當前資料,當p=2時又會執行後臺程式碼更新快取內容。
如果有多個引數時,如:http://localhost:1165/16-4-3/WebForm1.aspx?p=1&n=1
可以這樣宣告:@ OutputCache Duration="60" VaryByParam="p;n" %>
除此之外,@OutputCache 還有一些其他的屬性。@OutputCache指令中的屬性引數描述如下:
@ 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"
%>
|
CacheProfile
用於呼叫Web.config配置檔案中設定的快取時間。這是可選屬性,預設值為空字元 ("")。
例如:
在Web.config中加入配置:
<system.web> <caching> <outputCacheSettings> <outputCacheProfiles> <add name="CacheTest" duration="50" /> outputCacheProfiles> outputCacheSettings>
caching>
system.web>
|
頁面中宣告:
@ OutputCache CacheProfile="CacheTest" VaryByParam="none" %> |
注意: 包含在使用者控制元件(.ascx 檔案)中的 @ OutputCache 指令不支援此屬性。在頁中指定此屬性時,屬性值必須與outputCacheSettings 節下面的 outputCacheProfiles 元素中的一個可用項的名稱匹配。如果此名稱與配置檔案項不匹配,將引發異常。 |
如果每個頁面的快取時間相同,則不需要每個頁面設定,而是通過統一一個地方控制,這樣就可以更好的統一控制所有頁面的快取時間。如果想改變快取時間,只需要改一下web.config的配置資訊即可,而不用每個頁面去修改。
VaryByControl
通過使用者控制元件檔案中包含的伺服器控制元件來改變快取(值是控制元件ID,多控制元件用分號隔開)。
在 ASP.NET 頁和使用者控制元件上使用 @ OutputCache 指令時,需要該屬性或 VaryByParam 屬性。
@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs"Inherits="CacheWebApp._16_4_3.WebForm2" %> @ OutputCache Duration="60" VaryByParam="none"VaryByControl="DropDownList1" %>
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>根據控制元件頁面快取title> head> <body> <form id="form1" runat="server"> <div> =DateTime.Now %> <br> <asp:DropDownList ID="DropDownList1" runat="server"> <asp:ListItem>beijingasp:ListItem> <asp:ListItem>shanghaiasp:ListItem> <asp:ListItem>guangzhouasp:ListItem> asp:DropDownList> <asp:Button ID="Button1" runat="server" Text="提交" /> div> form> body>
html> |
以上程式碼設定快取有效期是60秒,並且頁面不隨任何GET或POST引數改變(即使不使用VaryByParam屬性,但是仍然需要在@ OutputControl指令中顯式宣告該屬性)。如果使用者控制元件中包含ID屬性為“DropDownList1”的伺服器控制元件(例如下拉框控制元件),那麼快取將根據該控制元件的變化來更新頁面資料。
頁面輸出快取API
Response類的Cache屬性用於獲取頁面快取策略。該方式的核心是呼叫System.Web.HttpCachePolicy。該類主要包含用於設定快取特定的HTTP標頭的方法和用於控制ASP.NET頁面輸出快取的方法。與.NET Framework 1.x中的HttpCachePolicy類相比,.NET Framework 2.0中的HttpCachePolicy類得到了擴充和發展。主要是增加了一些重要方法,例如,SetOmitVarStar方法等。由於HttpCachePolicy類方法眾多,下面簡要說明幾個常用方法。
SetExpires方法
用於設定快取過期的絕對時間。它的引數是一個DataTime類的例項,表示過期的絕對時間。
protected void Page_Load(object sender, EventArgs e) { // 通過API設定快取 //相當於@OutputCache指令中的Duration屬性 Response.Cache.SetExpires(DateTime.Now.AddSeconds(10)); Response.Cache.SetExpires(DateTime.Parse("6:00:00PM")); }
|
如上程式碼,第一行程式碼表示輸出快取時間是60秒,並且頁面不隨任何GET或POST引數改變,等同於“”。第二行程式碼設定快取過期的絕對時間是當日下午6時整。
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指令一起使用時,欄位副檔名才有效。如果組合不相容的指令和擴充套件,則此方法將引發無效引數異常。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-608131/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 系統快取全解析3:頁面區域性快取快取
- 系統快取全解析5:檔案快取依賴快取
- C#系統快取全解析C#快取
- 系統快取全解析4:應用程式資料快取快取
- 2PHP頁面快取PHP快取
- ASP.NET 2.0中的頁面輸出快取ASP.NET快取
- 去除頁面快取快取
- C# ASP.NET系統快取全解析C#ASP.NET快取
- PHP 輸出快取PHP快取
- Nuxt頁面級快取UX快取
- 頁面快取優化快取優化
- C#清除頁面快取C#快取
- Vue專案全域性配置頁面快取,實現按需讀取快取Vue快取
- 系統快取全解析7:第三方分散式快取解決方案 Memcached和Cacheman快取分散式
- nuxt3正確使用keepalive頁面快取元件快取UX快取元件
- .NET之頁面資料快取快取
- ASP.NET清除頁面快取ASP.NET快取
- 如何設計快取系統:快取穿透,快取擊穿,快取雪崩解決方案分析快取穿透
- 分散式系統快取系列一 認識快取分散式快取
- Vue 頁面快取keep-aliveVue快取Keep-Alive
- 使用Nginx+Memcache做頁面快取Nginx快取
- 解析分散式系統的快取設計分散式快取
- ASP.NET2.0揭祕讀書筆記之八——頁面輸出快取ASP.NET筆記快取
- myBatis原始碼解析-快取篇(2)MyBatis原始碼快取
- 【Django】Django快取系統Django快取
- 快取穿透、快取擊穿、快取雪崩、快取預熱快取穿透
- 高速輸出-我們戲說快取快取
- asp.net輸出快取的使用ASP.NET快取
- Nginx之11吸星大法 - (頁面快取)Nginx快取
- H5禁用頁面快取的方法H5快取
- 禁止頁面快取資料的方法分享快取
- Ehcache 整合Spring 使用頁面、物件快取Spring物件快取
- 網頁快取清理網頁快取
- 快取穿透、快取擊穿、快取雪崩快取穿透
- 快取穿透、快取雪崩、快取擊穿快取穿透
- Redis快取擊穿、快取穿透、快取雪崩Redis快取穿透
- HTTP快取——協商快取(快取驗證)HTTP快取
- [Redis]快取穿透/快取擊穿/快取雪崩Redis快取穿透