前言
這個系列的文章要討論的是如何通過asp.net服務器端技術來優化客戶端緩存策略,而且讓這種策略變得可配置和可擴展。我們要了解的知識從http協議中相關屬性對客戶端緩存的影響,到asp.net如何控制這些屬性來實現我們的緩存策略。
http基礎知識
由于討論涉及到客戶端緩存,所以還是先要簡單介紹一下http協議是如何控制客戶端緩存的,這里涉及到http頭的last-modified、etag等屬性。
last-modified
在瀏覽器第一次請求某一個url時,服務器端的返回狀態會是200,內容是你請求的資源,同時有一個last-modified的屬性標記此文件在服務期端最后被修改的時間,格式類似這樣:
last-modified: fri, 12 may 2006 18:53:33 gmt
客戶端第二次請求此url時,會在頭部加入一個屬性,詢問該時間之后文件是否有被修改過:
if-modified-since: fri, 12 may 2006 18:53:33 gmt
如果服務器端的文件沒有被修改過,則返回狀態是304,內容為空,這樣就節省了傳輸數據量。如果服務器端的文件被修改過,則返回和第一次請求時類似。
etag
和last-modified類似,由于rfc2616(也就是http/1.1)中沒有說明etag該是什么格式的,只要確保用雙引號括起來就行了,所以你可以用文件的hash,甚至是直接用last-modified,以下是服務器端返回的格式:
etag: "50b1c1d4f775c61:df3"
客戶端的查詢更新格式是這樣的:
if-none-match: w/"50b1c1d4f775c61:df3"
如果etag沒改變,則返回狀態304然后不返回,這也和last-modified一樣。
expires
這個屬性就如我們在asp中使用httpresponse.expiresabsolute一樣直接,聲明某某時刻過期之后瀏覽器就應該重新請求該url,使用格式為:
expires: sun, 10 feb 2002 16:00:00 gmt
注意httpresponse.expiresabsolute在asp.net中是不建議使用的,現在我們應該使用的是httpresponse.cache.setexpires。
pragma
通常我們用到的值就是no-cache,這和在cache-control中使用no-cache值是一樣的,cache-control在下面講。pragma的使用格式如下:
pragma: no-cache
cache-control
這是一個集合型屬性,它里面能夠包含很多子屬性,并且允許用戶擴展新的子屬性。常見的子屬性包括:
max-age - 以秒為單位的超時,覆蓋expires屬性。
public - 允許保存在共享緩存中。
private - 只允許保存在私有緩存中。
no-cache - 不允許緩存。
no-store - 不允許緩存在持久介質中。
no-transform - 不允許轉換存儲系統。
新聞熱點
疑難解答
圖片精選