系統緩存全解析(二)——頁面輸出緩存

 

頁面輸出緩存是最爲簡單的緩存機制,該機制將整個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>beijing</asp:ListItem>

        <asp:ListItem>shanghai</asp:ListItem>

        <asp:ListItem>guangzhou</asp: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參數改變,等同於“<%@ OutputCache Duration="60" VaryByParam="none" %>”。第二行代碼設置緩存過期的絕對時間是當日下午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指令一起使用時,字段擴展名纔有效。如果組合不兼容的指令和擴展,則此方法將引發無效參數異常。

轉自:http://www.cnblogs.com/ltp/archive/2009/06/30/1514314.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章