1. 程式人生 > >asp.net 根據Cookie變化控制快取

asp.net 根據Cookie變化控制快取

 

遇到一個實際應用:做的網站靜態內容居多,但是多語言支援,網站的開發已經結束,是將語言存入客戶端cookie中,然後通過cookie值獲取對應資原始檔。

現在需要對網站增加快取。在asp.net 框架下,當然是首選 OutputCache。OutputCache是將客戶端快取以及服務端快取進行統一管理,通過不同的策略設定。由於語言的更換不會修改URL,所以是無法使用瀏覽器快取了(這裡想起google以及很多網站在做多語言時都會把語言放入到URL中的好處了,可以充分利用瀏覽器快取)。

網上查了些資料,比較零碎,這裡進行一個整理。

首先:在web.config中定義快取策略,

在web.config中的system.web下增加如下:

雙擊程式碼全選
1 2 3 4 5 6 7 8 9 <caching> <outputCacheSettings> <outputCacheProfiles> <add name="pageCache" enabled="true" duration="600" varyByParam="none" varyByCustom="LANG" location="Server" /> <add name="productCache" enabled="true" duration="600" varyByParam="*" varyByCustom=
"LANG" location="Server" /> </outputCacheProfiles> </outputCacheSettings> <outputCache enableOutputCache="true"/> </caching>

這裡定義了兩條策略,一條是不會根據引數更新快取, 因為所有頁面不需要傳遞引數,然後使用 varyByCustom="LANG" 自定義快取失效,location設定快取儲存位置,這裡僅選擇Server.另外一條,需要根據傳遞的引數更新快取,所以設定 varyByParam="*"。

然後關鍵的一步實現自定義快取失效:需要在 Global.asax 中重寫GetVaryByCustomString

雙擊程式碼全選
1 2 3 4 public override string GetVaryByCustomString(HttpContext context, string custom) { return "LANG=" + context.Request.Cookies["PureWirelessEnt.Language"]["OverrideLanguage"].ToString(); }

 這裡的custom就是 varyByCustom 值,框架會呼叫此方法判斷是否有更新。如果定義了多個 varyByCustom的話,這裡程式碼可以使用

雙擊程式碼全選
1 2 3 4 5 6 7 8 9 switch(custom) { case "Lang" ... }

分別管理快取更新策略。我這裡是獲取cookie中的語言,如果語言改變時cookie改變,返回值也就改變,就會更新快取。

 使用快取策略,在aspx檔案頭部加入:

<%@ OutputCache CacheProfile="pageCache"%>

即可。

方法很簡單,但是很實用,另外,我判斷是否快取起效的方法是,啟用除錯,然後在頁面的page_load中設定斷點,然後瀏覽器中重新整理頁面,如果能獲取斷點,說明快取失效,如果無法獲取斷點,說明瀏覽器為快取中的內容。

本文技術含量不高,圈子裡有位朋友自定義實現通過檔案的方式進行快取, 如有未說到之處,或者更好的解決方案,歡迎指正。