在asp.net仲使用output cache 非常簡單。只需在頁面或者自訂控制項上聲明,即可以控制頁面或者控制項的緩衝策略。
例如:
1 <%@ OutputCache Duration ="10" VaryByParam="*" %>
這樣就聲明了一個頁面的緩衝策略。緩衝的存續時間為10秒,任何通過GET或者POST方式傳遞到頁面的參數都會使頁面的輸出緩衝失效。
頁面outputcache指令的具體參數在MSDN上有詳細說明,在此就不贅述了。
使用輸出緩衝應注意以下:
asp.net頁面在緩衝產生以後,失效之前,所有對該頁面的請求,直接從記憶體中取出並送顯,將不會經曆asp.net的頁面生命週期。也就是說在頁面聲明周期內的各種事件內的代碼,將不會被執行。
往往頁面不能夠整體被緩衝,有些部門需要及時更新,這就需要部分頁緩衝或者緩衝後替換。
部分頁緩衝
為自訂控制項聲明緩衝,頁面中調用該控制項,控制項將會緩衝,其餘部分不被緩衝。
被緩衝後的控制項一樣不經曆生命週期,將不能和頁面互動。
緩衝後替換
MSDN給出三種緩衝後替換方案:
1. Substitution控制項實現緩衝後替換
<asp:Substitution ID="Substitution1" runat="server" MethodName="GetDate" />
C#代碼:
protected static string GetDate(HttpContext context)
{
return "<b>" + DateTime.Now + "</b>";
}
注意:(1)substitution控制項的MethodName屬性所指定的方法必須為靜態方法並具有HttpContext型別參數。
(2)在上例中的GetDate方法中,因為沒有經曆頁面的生命週期,在方法體內Request、Session、Cookies等等頁面屬性都是停用。
2.Response.WriteSubstitution 方法
Response.WriteSubstitution(new HttpResponseSubstitutionCallback(GetDate));
GetDate方法同上。
3. AdRotator控制項
Adrotator伺服器控制項在內部實現對緩衝後替換的支援
另外在使用時我發現一種比較另類的緩衝後替換,比較適合於懶人。那就是用iframe,在iframe記憶體放動態更新的內容。
如果頁面大面積需要緩衝,而只有一小塊不能緩衝,而且這一塊的動態更新需要依賴Page屬性(比如Session)或者控制項的值,可以考慮iframe。
最後,在使用中發現這樣一個問題。asp.net會緩衝兩個版本:一個是首次開啟時被緩衝的版本,一個頁面建立緩衝之後第一次postback的版本。
也就是說在頁面被緩衝之後,第一次postback會執行頁面的生命週期。以後的請求,如果是首次請求則送顯首次開啟的緩衝版本,如果是postback則送顯第一次postback時的緩衝版本。不清楚為什麼會是這樣?為什麼頁面被緩衝之後,第一次postback還會起作用?還請各位大俠點撥。