系統快取全解析2:頁面輸出快取

iDotNetSpace發表於2009-07-02

頁面輸出快取是最為簡單的快取機制,該機制將整個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秒,並且頁面不隨任何GETPOST引數改變(即使不使用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秒,並且頁面不隨任何GETPOST引數改變,等同於“”。第二行程式碼設定快取過期的絕對時間是當日下午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列舉值,包括NoCachePrivatePublicServerServerAndNoCacheServerAndPrivate(有關這些列舉值的定義,可參考MSDN)。另一種方法的引數有兩個,一個引數是HttpCacheability列舉值,另一個引數是字串,表示新增到標頭的快取控制擴充套件。需要注意的是,僅當與PrivateNoCache指令一起使用時,欄位副檔名才有效。如果組合不相容的指令和擴充套件,則此方法將引發無效引數異常。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-608131/,如需轉載,請註明出處,否則將追究法律責任。

相關文章