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中設定斷點,然後瀏覽器中重新整理頁面,如果能獲取斷點,說明快取失效,如果無法獲取斷點,說明瀏覽器為快取中的內容。
本文技術含量不高,圈子裡有位朋友自定義實現通過檔案的方式進行快取, 如有未說到之處,或者更好的解決方案,歡迎指正。