前言
這個(gè)系列的文章要討論的是如何通過(guò)ASP.net服務(wù)器端技術(shù)來(lái)優(yōu)化客戶端緩存策略,而且讓這種策略變得可配置和可擴(kuò)展。我們要了解的知識(shí)從HTTP協(xié)議中相關(guān)屬性對(duì)客戶端緩存的影響,到ASP.NET如何控制這些屬性來(lái)實(shí)現(xiàn)我們的緩存策略。
HTTP基礎(chǔ)知識(shí)
由于討論涉及到客戶端緩存,所以還是先要簡(jiǎn)單介紹一下HTTP協(xié)議是如何控制客戶端緩存的,這里涉及到HTTP頭的Last-Modified、ETag等屬性。
Last-Modified
在瀏覽器第一次請(qǐng)求某一個(gè)URL時(shí),服務(wù)器端的返回狀態(tài)會(huì)是200,內(nèi)容是你請(qǐng)求的資源,同時(shí)有一個(gè)Last-Modified的屬性標(biāo)記此文件在服務(wù)期端最后被修改的時(shí)間,格式類似這樣:
Last-Modified: Fri, 12 May 2006 18:53:33 GMT
客戶端第二次請(qǐng)求此URL時(shí),會(huì)在頭部加入一個(gè)屬性,詢問(wèn)該時(shí)間之后文件是否有被修改過(guò):
If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT
如果服務(wù)器端的文件沒(méi)有被修改過(guò),則返回狀態(tài)是304,內(nèi)容為空,這樣就節(jié)省了傳輸數(shù)據(jù)量。如果服務(wù)器端的文件被修改過(guò),則返回和第一次請(qǐng)求時(shí)類似。
ETag
和Last-Modified類似,由于RFC2616(也就是HTTP/1.1)中沒(méi)有說(shuō)明ETag該是什么格式的,只要確保用雙引號(hào)括起來(lái)就行了,所以你可以用文件的hash,甚至是直接用Last-Modified,以下是服務(wù)器端返回的格式:
ETag: "50b1c1d4f775c61:df3"
客戶端的查詢更新格式是這樣的:
If-None-Match: W/"50b1c1d4f775c61:df3"
如果ETag沒(méi)改變,則返回狀態(tài)304然后不返回,這也和Last-Modified一樣。
Expires
這個(gè)屬性就如我們?cè)贏SP中使用HttpResponse.ExpiresAbsolute一樣直接,聲明某某時(shí)刻過(guò)期之后瀏覽器就應(yīng)該重新請(qǐng)求該URL,使用格式為:
Expires: Sun, 10 Feb 2002 16:00:00 GMT
注意HttpResponse.ExpiresAbsolute在ASP.NET中是不建議使用的,現(xiàn)在我們應(yīng)該使用的是HttpResponse.Cache.SetExpires。
Pragma
通常我們用到的值就是no-cache,這和在Cache-Control中使用no-cache值是一樣的,Cache-Control在下面講。Pragma的使用格式如下:
Pragma: no-cache
Cache-Control
這是一個(gè)集合型屬性,它里面能夠包含很多子屬性,并且允許用戶擴(kuò)展新的子屬性。常見(jiàn)的子屬性包括:
max-age - 以秒為單位的超時(shí),覆蓋Expires屬性。
public - 允許保存在共享緩存中。
private - 只允許保存在私有緩存中。
no-cache - 不允許緩存。
no-store - 不允許緩存在持久介質(zhì)中。
no-transform - 不允許轉(zhuǎn)換存儲(chǔ)系統(tǒng)。
這個(gè)系列的文章要討論的是如何通過(guò)ASP.net服務(wù)器端技術(shù)來(lái)優(yōu)化客戶端緩存策略,而且讓這種策略變得可配置和可擴(kuò)展。我們要了解的知識(shí)從HTTP協(xié)議中相關(guān)屬性對(duì)客戶端緩存的影響,到ASP.NET如何控制這些屬性來(lái)實(shí)現(xiàn)我們的緩存策略。
HTTP基礎(chǔ)知識(shí)
由于討論涉及到客戶端緩存,所以還是先要簡(jiǎn)單介紹一下HTTP協(xié)議是如何控制客戶端緩存的,這里涉及到HTTP頭的Last-Modified、ETag等屬性。
Last-Modified
在瀏覽器第一次請(qǐng)求某一個(gè)URL時(shí),服務(wù)器端的返回狀態(tài)會(huì)是200,內(nèi)容是你請(qǐng)求的資源,同時(shí)有一個(gè)Last-Modified的屬性標(biāo)記此文件在服務(wù)期端最后被修改的時(shí)間,格式類似這樣:
Last-Modified: Fri, 12 May 2006 18:53:33 GMT
客戶端第二次請(qǐng)求此URL時(shí),會(huì)在頭部加入一個(gè)屬性,詢問(wèn)該時(shí)間之后文件是否有被修改過(guò):
If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT
如果服務(wù)器端的文件沒(méi)有被修改過(guò),則返回狀態(tài)是304,內(nèi)容為空,這樣就節(jié)省了傳輸數(shù)據(jù)量。如果服務(wù)器端的文件被修改過(guò),則返回和第一次請(qǐng)求時(shí)類似。
ETag
和Last-Modified類似,由于RFC2616(也就是HTTP/1.1)中沒(méi)有說(shuō)明ETag該是什么格式的,只要確保用雙引號(hào)括起來(lái)就行了,所以你可以用文件的hash,甚至是直接用Last-Modified,以下是服務(wù)器端返回的格式:
ETag: "50b1c1d4f775c61:df3"
客戶端的查詢更新格式是這樣的:
If-None-Match: W/"50b1c1d4f775c61:df3"
如果ETag沒(méi)改變,則返回狀態(tài)304然后不返回,這也和Last-Modified一樣。
Expires
這個(gè)屬性就如我們?cè)贏SP中使用HttpResponse.ExpiresAbsolute一樣直接,聲明某某時(shí)刻過(guò)期之后瀏覽器就應(yīng)該重新請(qǐng)求該URL,使用格式為:
Expires: Sun, 10 Feb 2002 16:00:00 GMT
注意HttpResponse.ExpiresAbsolute在ASP.NET中是不建議使用的,現(xiàn)在我們應(yīng)該使用的是HttpResponse.Cache.SetExpires。
Pragma
通常我們用到的值就是no-cache,這和在Cache-Control中使用no-cache值是一樣的,Cache-Control在下面講。Pragma的使用格式如下:
Pragma: no-cache
Cache-Control
這是一個(gè)集合型屬性,它里面能夠包含很多子屬性,并且允許用戶擴(kuò)展新的子屬性。常見(jiàn)的子屬性包括:
max-age - 以秒為單位的超時(shí),覆蓋Expires屬性。
public - 允許保存在共享緩存中。
private - 只允許保存在私有緩存中。
no-cache - 不允許緩存。
no-store - 不允許緩存在持久介質(zhì)中。
no-transform - 不允許轉(zhuǎn)換存儲(chǔ)系統(tǒng)。

