.NET之頁面資料快取

iDotNetSpace發表於2009-05-25

在原始碼中設定頁面快取
@ OutputCache:以宣告的方式控制 ASP.NET 頁或頁中包含的使用者控制元件的輸出快取策略。
主要屬性:

Duration:頁或使用者控制元件進行快取的時間(以秒計)。在頁或使用者控制元件上設定該屬性為來自物件的 HTTP 響應建立了一個過期策略,並將自動快取頁或使用者控制元件輸出。這是必選屬性。如果未包含該屬性,將出現分析器錯誤。
Location:指定有效值,用於控制資源的輸出快取 HTTP 響應的位置。預設值為 Any。包含在使用者控制元件(.ascx 檔案)中的 @ OutputCache 指令不支援此屬性。
成員名稱
 說明
 
Any 輸出快取可位於產生請求的瀏覽器客戶端、參與請求的代理伺服器(或任何其他伺服器)或處理請求的伺服器上。
Client 輸出快取位於產生請求的瀏覽器客戶端上。
Downstream 輸出快取可儲存在任何 HTTP 1.1 可快取裝置中,源伺服器除外。這包括代理伺服器和發出請求的客戶端。
Server 輸出快取位於處理請求的 Web 伺服器上。
None 對於請求的頁,禁用輸出快取。
ServerAndClient 輸出快取只能儲存在源伺服器或發出請求的客戶端中。代理伺服器不能快取響應。

CacheProfile:與該頁關聯的快取設定的名稱。這是可選屬性,預設值為空字串 ("")。包含在使用者控制元件(.ascx 檔案)中的 @ OutputCache 指令不支援此屬性。在頁中指定此屬性時,屬性值必須與 outputCacheSettings 節下面的 outputCacheProfiles 元素中的一個可用項的名稱匹配。如果此名稱與配置檔案項不匹配,將引發異常。
NoStore:一個布林值,它決定了是否阻止敏感資訊的二級儲存。將此屬性設定為 true 等效於在請求期間執行以下程式碼:Response.Cache.SetNoStore();包含在使用者控制元件(.ascx 檔案)中的 @ OutputCache 指令不支援此屬性。
Shared:一個布林值,確定使用者控制元件輸出是否可以由多個頁共享。預設值為 false。 包含在 ASP.NET 頁(.aspx 檔案)中的 @ OutputCache 指令不支援此屬性。
SqlDependency:標識一組資料庫/表名稱對的字串值,頁或控制元件的輸出快取依賴於這些名稱對。可選值:database/table name pair和CommandNotification。SqlDependency 屬性的 CommandNotification 值僅在網頁 (.aspx) 中有效。使用者控制元件只能將基於表的輪詢用於 @ OutputCache 指令。
VaryByCustom:表示自定義輸出快取要求的任意文字。如果賦予該屬性的值為 browser,快取將隨瀏覽器名稱和主要版本資訊的不同而異。如果輸入自定義字串,則必須在應用程式的 Global.asax 檔案中重寫 GetVaryByCustomString 方法。
VaryByHeader:分號分隔的 HTTP 標頭列表,用於使輸出快取發生變化。將該屬性設為多標頭時,對於每個指定標頭組合,輸出快取都包含一個不同版本的請求文件。
設定 VaryByHeader 屬性將啟用在所有 HTTP 1.1 版快取中快取項,而不僅僅在 ASP.NET 快取中進行快取。使用者控制元件中的 @ OutputCache 指令不支援此屬性。

VaryByParam:分號分隔的字串列表,用於使輸出快取發生變化。預設情況下,這些字串與隨 GET 方法屬性傳送的查詢字串值對應,或與使用 POST 方法傳送的引數對應。將該屬性設定為多個引數時,對於每個指定引數組合,輸出快取都包含一個不同版本的請求文件。可能的值包括 none、星號 (*) 以及任何有效的查詢字串或 POST 引數名稱。在 ASP.NET 頁和使用者控制元件上使用 @ OutputCache 指令時,需要該屬性或 VaryByControl 屬性。如果沒有包含它,則發生分析器錯誤。如果不希望通過指定引數來改變快取內容,請將值設定為 none。如果希望通過所有的引數值改變輸出快取,請將屬性設定為星號 (*))。
VaryByControl:一個分號分隔的字串列表,用於更改使用者控制元件的輸出快取。這些字串代表使用者控制元件中宣告的 ASP.NET 伺服器控制元件的 ID 屬性值。在 ASP.NET 頁和使用者控制元件上使用 @ OutputCache 指令時,需要該屬性或 VaryByParam 屬性。
VaryByContentEncodings:以分號分隔的字串列表,用於更改輸出快取。將 VaryByContentEncodings 屬性用於 Accept-Encoding 標頭,可確定不同內容編碼獲得快取響應的方式。
事例:

在頁面原始碼中新增如下程式碼,當前頁面快取100秒。

在cs程式碼中,在using的下方新增如下程式碼,當前頁面快取100秒。
[PartialCaching(100)]
在cs程式碼中調節使用者控制元件中頁面快取。
        //test.ascx使用者控制元件中設定了頁面快取
        PartialCachingControl pcc = LoadControl("test.ascx") as PartialCachingControl;
        //如果控制元件中頁面快取大於10秒
        if(pcc.CachePolicy.Duration>TimeSpan.FromSeconds(10))
        {
            //設定控制元件中頁面快取為20秒
            pcc.CachePolicy.SetExpires(DateTime.Now.Add(TimeSpan.FromSeconds(20)));
            //設定快取和調還是絕對過期
            pcc.CachePolicy.SetSlidingExpiration(false);
        }
        //將控制元件新增到頁面
        Controls.Add(pcc);

通過頁面資料快取填充GridView Code
protected void Page_Load(object sender, EventArgs e)
    {
        //判斷快取中是否包含"key"的資料,有就讀取,否則讀取xml檔案中的資料
        DataSet ds = new DataSet();
        if (Cache["key"] == null)
        {
            ds.ReadXml(Server.MapPath("~/XMLFile.xml");
            this.GridView1.DataSource=ds;
            this.GridView1.DataBind();
        }
        else
        {
            ds=(DataSet)Cache["key"];
            this.GridView1.DataSource=ds;
            this.GridView1.DataBind();
        }

}

protected void DisplayCacheInfo()
    {
        //cache裡的數量
        string cacheCount = Cache.Count.ToString();
        //列舉cache
        IDictionaryEnumerator cacheEnum = Cache.GetEnumerator();
        //將每一個cache名稱列印螢幕上
        while (cacheEnum.MoveNext())
        {
            this.Label1.Text += cacheEnum.Key.ToString();
        }
    }
protected void Buttonadd_Click(object sender, EventArgs e)
    {
        //新增cache
        if (Cache["key"] == null)
        {
            DataSet ds = new DataSet();
            ds.ReadXml(Server.MapPath("~/XMLFile.xml");
            Cache.Insert("key",ds,new System.Web.Caching.CacheDependency(Server.MapPath("XMLFile.xml")));
        }
        DisplayCacheInfo();
    }
protected void Buttonselect_Click(object sender, EventArgs e)
    {
        //檢索cache
        if (Cache["key"] != null)
        DisplayCacheInfo();
    }
protected void Buttondelete_Click(object sender, EventArgs e)
   {
       //移除cache
       if (Cache["key"] != null)
       {
           Cache.Remove("key");
       }
       DisplayCacheInfo();
   }

原文:http://www.cnblogs.com/shanymen/archive/2009/05/25/1488839.html

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

相關文章