asp.net輸出快取的使用

iDotNetSpace發表於2010-04-14

在asp.net仲使用output cache 非常簡單。只需在頁面或者自定義控制元件上宣告,即可以控制頁面或者控制元件的快取策略。

例如:

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gt1 @ OutputCache Duration ="10" VaryByParam="*" %>

 

這樣就宣告瞭一個頁面的快取策略。快取的存續時間為10秒,任何通過GET或者POST方式傳遞到頁面的引數都會使頁面的輸出快取失效。

頁面outputcache指令的具體引數在MSDN上有詳細說明,在此就不贅述了。

使用輸出快取應注意以下:

asp.net頁面在快取生成以後,失效之前,所有對該頁面的請求,直接從記憶體中取出並送顯,將不會經歷asp.net的頁面生命週期。也就是說在頁面宣告週期內的各種事件內的程式碼,將不會被執行。

 

往往頁面不能夠整體被快取,有些部門需要及時更新,這就需要部分頁快取或者快取後替換。 

部分頁快取

為自定義控制元件宣告快取,頁面中呼叫該控制元件,控制元件將會快取,其餘部分不被快取。

被快取後的控制元件一樣不經歷生命週期,將不能和頁面互動。

快取後替換

MSDN給出三種快取後替換方案:

1. Substitution控制元件實現快取後替換

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gt<asp:Substitution ID="Substitution1" runat="server" MethodName="GetDate" />

C#程式碼:

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gtprotected static string GetDate(HttpContext context)
    {
        
return "" + DateTime.Now + "";
    }

注意:(1)substitution控制元件的MethodName屬性所指定的方法必須為靜態方法並具有HttpContext型別引數。

   (2)在上例中的GetDate方法中,因為沒有經歷頁面的生命週期,在方法體內Request、Session、Cookies等等頁面屬性都是不可用的。

 

2.Response.WriteSubstitution 方法

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gtResponse.WriteSubstitution(new HttpResponseSubstitutionCallback(GetDate));

 GetDate方法同上。

 

3. AdRotator控制元件

Adrotator伺服器控制元件在內部實現對快取後替換的支援

 

另外在使用時我發現一種比較另類的快取後替換,比較適合於懶人。那就是用iframe,在iframe記憶體放動態更新的內容。

如果頁面大面積需要快取,而只有一小塊不能快取,而且這一塊的動態更新需要依賴Page屬性(比如Session)或者控制元件的值,可以考慮iframe。

 

最後,在使用中發現這樣一個問題。asp.net會快取兩個版本:一個是首次開啟時被快取的版本,一個頁面建立快取之後第一次postback的版本。

也就是說在頁面被快取之後,第一次postback會執行頁面的生命週期。以後的請求,如果是首次請求則送顯首次開啟的快取版本,如果是postback則送顯第一次postback時的快取版本。不清楚為什麼會是這樣?為什麼頁面被快取之後,第一次postback還會起作用?還請各位大俠點撥。

 

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

相關文章