讓瀏覽器做緩衝需要給瀏覽器發送指定的Http頭,告訴瀏覽器緩衝多長時間,或者堅決不要緩衝。作為.net的程式員,其實我們一直都在用這種方法,在OutputCache指令中指定緩衝的Location為Client時,其實就是給瀏覽器發送了一個Http頭,告訴瀏覽器這個Url要緩衝多長時間,最後修改的時間。
微軟在OutputCacheModule中對這些緩衝用到的Http頭給我們進行了很好的封裝,但是瞭解這些Http頭可以更靈活的使用它們。
和用戶端緩衝相關的Http頭有以下幾個,分別是:
1. Expires:+到期時間
表示在指定時間後瀏覽器緩衝失效,需要注意的是這兒的到期時間必須是HTTP格式的日期時間,其他的都會被解析成目前時間“之前”,緩衝會馬上到期,HTTP的日期時間必須是格林威治時間(GMT),而不是本地時間。舉例: 複製代碼 代碼如下:Expires: Fri, 30 Oct 2009 14:19:41
使用Expires到期必須要求伺服器的時間是正確的,否則發送的http頭就會出問題,在windows服務下可以設定時間伺服器來同步時間。
2. Cache-control:
Cache-control直譯成中文就是緩衝控制,它的作用就是緩衝控制,這個http頭的值有幾種。
1) max-age=[秒] — 執行緩衝被認為是最新的最長時間。類似於到期時間,這個參數是基於請求時間的相對時間間隔,而不是絕對到期時間,[秒]是一個數字,單位是秒:從請求時間開始到到期時間之間的秒數。
2) s-maxage=[秒] — 類似於max-age屬性,除了他應用於共用(如:Proxy 伺服器)緩衝
3) public — 標記認證內容也可以被緩衝,一般來說: 經過HTTP認證才能訪問的內容,輸出是自動不可以緩衝的;
4) no-cache — 強制每次請求直接發送給原始伺服器,而不經過本機快取版本的校正。這對於需要確認認證應用很有用(可以和public結合使用),或者嚴格要求使用最新資料的應用(不惜犧牲使用緩衝的所有好處);
5) no-store — 強制緩衝在任何情況下都不要保留任何副本
6) must-revalidate — 告訴緩衝必須遵循所有你給予副本的新鮮度的,HTTP允許緩衝在某些特定情況下返回到期資料,指定了這個屬性,你快取,你希望嚴格的遵循你的規則。
7) proxy-revalidate — 和 must-revalidate類似,除了他只對緩衝Proxy 伺服器起作用
舉例: 複製代碼 代碼如下:Cache-Control: max-age=3600, must-revalidate
很顯然Cache-control可以提供比Expires更靈活的緩衝控制,而且它不需要依賴於伺服器時間。
在Asp.Net中微軟把對Cache-control屬性的設定封裝到了HttpCachePolicy類中,我們可以通過Response.Cache來調用以下方法來做到對Cache-Control Http頭值的控制: 複製代碼 代碼如下:Response.CacheControl;
Response.Cache.SetNoStore
Response.Cache.SetMaxAge
Response.Cache.SetProxyMaxAge
Response.Cache.SetRevalidation
3. Last-Modified/If-Modified-Since
這兩個Http頭是一對,前者表示某個地址的最新動向時間,是伺服器端響應給用戶端的;而後者是用戶端瀏覽器發送給伺服器的,告訴web伺服器用戶端有一個最後更改時間為什麼時間的緩衝,伺服器端接收到If-Modified-Since頭後則判斷用戶端緩衝的這份url地址的緩衝是否是最新的,如果是最新的則伺服器端直接給用戶端返回HttpStatus 304,意思是說這個內容在你上次請求之後沒有變化過,你直接用緩衝就可以了;如果伺服器發現url的最後更新時間比If-Modified-Since的值要新,則會輸出新的內容。
同樣微軟也為我們做了伺服器端設定的封裝,我們可以這樣調用 複製代碼 代碼如下:Response.Cache.SetLastModified(DateTime)
Response.Cache.SetLastModifiedFromFileDependencies()
如果有更複雜的需求就需要自己處理了。
4. ETag/If-None-Match
ETag和Last-Modified類似,不過他發送的是一個字串來標示url的版本,如果url變了則此標示也跟著變化,在瀏覽器發送If-None-Match時告訴瀏覽器內容已經變了,或者沒變可以使用緩衝。
Iis會自動給靜態檔案加上Etag,在檔案發生改變時重建一個Etag,這樣對於一個網站中的n多個靜態檔案如:樣式表,小圖片等,用戶端只下載一次就夠了,可以減輕負載。
在Asp.Net中我們可以用以下兩個方法來設定 複製代碼 代碼如下:Response.Cache.SetETag(string)
Response.Cache.SetETagFromFileDependencies()
儘管微軟為我們做了很多封裝,但是我們還是需要詳細的瞭解之後才可以用好這幾個Http頭。