1. 客戶端瀏覽器上的緩存(非Cookie, Cookie中的內容為: 鍵和值均為string類型的鍵值對)
我們可以通過在Http回應中增加特定的頭部說明來指定瀏覽器的緩存策略; 添加頭部說明的手段既可以通過頁面指令聲明設置, 也可以通過編程方式設置.
對於圖片、Javascript腳本、CSS等資源, 可以在IIS管理器中, 右擊圖片等資源, 選擇”屬性” --> HttpHeaders后, 勾選Enable Content Expiration並設置時間即可. 一種值得推薦的手段是, 將需要緩存的資源分類, 如: image/dynamic/、image/static/, 這樣我們可以再文件夾上, 選擇屬性中的HttpHeaders進行設置. 否則, 針對每一個靜態資源設置HttpHeaders將是件非常痛苦的事情. 此外, 還可以采用一款名為CacheRight的工具可以提供緩存資源的統一配置.
查看或設置瀏覽器緩存位置: IE --> Internet選項 --> 常規 --> 臨時Internet文件 --> 設置
Html文件的Head中的緩存設置:
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="expires" content="Wed, 26 Feb 1997 08:21:57 GMT" />
瀏覽器中關於Cache的3屬性:
Cache-Control:
設置相對過期時間, max-age指明以秒為單位的緩存時間. 若對靜態資源只緩存一次, 可以設置max-age的值為315360000000 (一萬年).
Http協議的cache-control的常見取值及其組合釋義:
no-cache: 數據內容不能被緩存, 每次請求都重新訪問服務器, 若有max-age, 則緩存期間不訪問服務器.
no-store: 不僅不能緩存, 連暫存也不可以(即: 臨時文件夾中不能暫存該資源)
private(默認): 只能在瀏覽器中緩存, 只有在第一次請求的時候才訪問服務器, 若有max-age, 則緩存期間不訪問服務器.
public: 可以被任何緩存區緩存, 如: 瀏覽器、服務器、代理服務器等
max-age: 相對過期時間, 即以秒為單位的緩存時間.
no-cache, private: 打開新窗口時候重新訪問服務器, 若設置max-age, 則緩存期間不訪問服務器.
private, 正數的max-age: 后退時候不會訪問服務器
no-cache, 正數的max-age: 后退時會訪問服務器
點擊刷新: 無論如何都會訪問服務器.
Expires:
設置以分鍾為單位的絕對過期時間, 優先級比Cache-Control低, 同時設置Expires和Cache-Control則后者生效.
Last-Modified:
該資源的最后修改時間, 在瀏覽器下一次請求資源時, 瀏覽器將先發送一個請求到服務器上, 並附上If-Unmodified-Since頭來說明瀏覽器所緩存資源的最后修改時間, 如果服務器發現沒有修改, 則直接返回304(Not Modified)回應信息給瀏覽器(內容很少), 如果服務器對比時間發現修改了, 則照常返回所請求的資源.
注意:
Last-Modified屬性通常和Expires或Cache-Control屬性配合使用, 因為即使瀏覽器設置緩存, 當用戶點擊”刷新”按鈕時, 瀏覽器會忽略緩存繼續向服務器發送請求, 這時Last-Modified將能夠很好的減小回應開銷.
ETag將返回給瀏覽器一個資源ID, 如果有了新版本則正常發送並附上新ID, 否則返回304, 但是在服務器集群情況下, 每個服務器將返回不同的ID, 因此不建議使用ETag.
以上描述的客戶端瀏覽器緩存是指存儲位置在客戶端瀏覽器, 但是對客戶端瀏覽器緩存的實際設置工作是在服務器上的資源中完成的. 雖然剛才我們介紹了有關於客戶端瀏覽器緩存的屬性, 但是實際上對這些屬性的設置工作都需要在服務器的資源中做設置. 我們有兩種操作手段對瀏覽器緩存進行設置, 一個是通過頁面指令聲明來設置, 另外一個是通過編程方式來設置.
瀏覽器緩存的設置手段:
第一: 通過頁面指令聲明來設置HTTP的緩存
頁面指令<%@ OutputCache Location=”Any” Duration=”10” VaryByParam=”ProductId” VaryByHeader=”Accept-Language”%>中的Location用來設置緩存的位置, 該屬性常見的值為:
Any(默認): 輸出緩存可以位於任何地點, 對應於HttpCacheability.Public. 如: 客戶端瀏覽器、代理服務器或服務器本身.
Client: 只能位於發出請求的客戶端瀏覽器, 對應於HttpCacheability.Private.
Downstream: 輸出緩存可以位於除服務器本身的其他任何地方, 如: 客戶端瀏覽器、代理服務器.
Server: 輸出緩存位於Web服務器本身, 對應於HttpCacheability.Server
ServerAndClient: 輸出緩存只能位於服務器本身或客戶端瀏覽器, 對應於HttpCacheability.Private和HttpCacheability.Server
None: 禁用輸出緩存, 對應於HttpCacheability.NoCache.
VaryByParam屬性: 根據請求參數的不同而緩存不同的版本. 多個值用分號(;)分隔, *號表示為任意參數或參數組合緩存不同版本, “none”表示只緩存一個版本.
VaryByHeader屬性: 根據請求頭來緩存不同的版本, 如同一頁面的不同語言版本.
VaryByCustom屬性: 根據自定義參數來緩存不同的版本, 如: VaryByCunstom=”browser”是系統已實現的, 根據瀏覽器名稱和版本號緩存不同的版本. 也可以, 根據自定義參數來緩存, 如: VaryByCustom=”happy”, 此時系統不知道如何解釋happy, 因此需要在Global.asax或IHttpModule實現類中重寫GetVaryByCustomString()方法, 來完成處理邏輯.
VaryByControl屬性: 根據用戶控件中的服務器控件ID來緩存不同版本.
更高級的方式, 是通過配置文件來設置HTTP的緩存.
頁面指令為<%@ OutputCache CacheProfile=”cacheconfig”%>, 其中cacheconfig是配置文件中的緩存配置節中CacheProfile的名稱.
View Code< caching >
< outputCacheSettings >
< outputCacheProfiles >
< add name ="cacheconfig" duration ="10" varyByParam ="none" />
</ outputCacheProfiles >
</ outputCacheSettings >
</ caching >
</ system.web >