asp.net 客戶(hù)端瀏覽器緩存的Http頭介紹
更新時(shí)間:2009年07月18日 14:15:37 作者:
做網(wǎng)站開(kāi)發(fā)離不開(kāi)緩存,緩存分好多種:服務(wù)器緩存,第三方緩存,瀏覽器緩存等。其中瀏覽器緩存是代價(jià)最小的,因?yàn)闉g覽器緩存依賴(lài)的是客戶(hù)端,而幾乎不耗費(fèi)服務(wù)器端的資源。
讓瀏覽器做緩存需要給瀏覽器發(fā)送指定的Http頭,告訴瀏覽器緩存多長(zhǎng)時(shí)間,或者堅(jiān)決不要緩存。作為.net的程序員,其實(shí)我們一直都在用這種方法,在OutputCache指令中指定緩存的Location為Client時(shí),其實(shí)就是給瀏覽器發(fā)送了一個(gè)Http頭,告訴瀏覽器這個(gè)Url要緩存多長(zhǎng)時(shí)間,最后修改的時(shí)間。
微軟在OutputCacheModule中對(duì)這些緩存用到的Http頭給我們進(jìn)行了很好的封裝,但是了解這些Http頭可以更靈活的使用它們。
和客戶(hù)端緩存相關(guān)的Http頭有以下幾個(gè),分別是:
1. Expires:+過(guò)期時(shí)間
表示在指定時(shí)間后瀏覽器緩存失效,需要注意的是這兒的過(guò)期時(shí)間必須是HTTP格式的日期時(shí)間,其他的都會(huì)被解析成當(dāng)前時(shí)間“之前”,緩存會(huì)馬上過(guò)期,HTTP的日期時(shí)間必須是格林威治時(shí)間(GMT),而不是本地時(shí)間。舉例:
Expires: Fri, 30 Oct 2009 14:19:41
使用Expires過(guò)期必須要求服務(wù)器的時(shí)間是正確的,否則發(fā)送的http頭就會(huì)出問(wèn)題,在windows服務(wù)下可以設(shè)置時(shí)間服務(wù)器來(lái)同步時(shí)間。
2. Cache-control:
Cache-control直譯成中文就是緩存控制,它的作用就是緩存控制,這個(gè)http頭的值有幾種。
1) max-age=[秒] — 執(zhí)行緩存被認(rèn)為是最新的最長(zhǎng)時(shí)間。類(lèi)似于過(guò)期時(shí)間,這個(gè)參數(shù)是基于請(qǐng)求時(shí)間的相對(duì)時(shí)間間隔,而不是絕對(duì)過(guò)期時(shí)間,[秒]是一個(gè)數(shù)字,單位是秒:從請(qǐng)求時(shí)間開(kāi)始到過(guò)期時(shí)間之間的秒數(shù)。
2) s-maxage=[秒] — 類(lèi)似于max-age屬性,除了他應(yīng)用于共享(如:代理服務(wù)器)緩存
3) public — 標(biāo)記認(rèn)證內(nèi)容也可以被緩存,一般來(lái)說(shuō): 經(jīng)過(guò)HTTP認(rèn)證才能訪問(wèn)的內(nèi)容,輸出是自動(dòng)不可以緩存的;
4) no-cache — 強(qiáng)制每次請(qǐng)求直接發(fā)送給源服務(wù)器,而不經(jīng)過(guò)本地緩存版本的校驗(yàn)。這對(duì)于需要確認(rèn)認(rèn)證應(yīng)用很有用(可以和public結(jié)合使用),或者嚴(yán)格要求使用最新數(shù)據(jù)的應(yīng)用(不惜犧牲使用緩存的所有好處);
5) no-store — 強(qiáng)制緩存在任何情況下都不要保留任何副本
6) must-revalidate — 告訴緩存必須遵循所有你給予副本的新鮮度的,HTTP允許緩存在某些特定情況下返回過(guò)期數(shù)據(jù),指定了這個(gè)屬性,你高速緩存,你希望嚴(yán)格的遵循你的規(guī)則。
7) proxy-revalidate — 和 must-revalidate類(lèi)似,除了他只對(duì)緩存代理服務(wù)器起作用
舉例:
Cache-Control: max-age=3600, must-revalidate
很顯然Cache-control可以提供比Expires更靈活的緩存控制,而且它不需要依賴(lài)于服務(wù)器時(shí)間。
在Asp.Net中微軟把對(duì)Cache-control屬性的設(shè)置封裝到了HttpCachePolicy類(lèi)中,我們可以通過(guò)Response.Cache來(lái)調(diào)用以下方法來(lái)做到對(duì)Cache-Control Http頭值的控制:
Response.CacheControl;
Response.Cache.SetNoStore
Response.Cache.SetMaxAge
Response.Cache.SetProxyMaxAge
Response.Cache.SetRevalidation
3. Last-Modified/If-Modified-Since
這兩個(gè)Http頭是一對(duì),前者表示某個(gè)地址的最近更新時(shí)間,是服務(wù)器端響應(yīng)給客戶(hù)端的;而后者是客戶(hù)端瀏覽器發(fā)送給服務(wù)器的,告訴web服務(wù)器客戶(hù)端有一個(gè)最后更改時(shí)間為什么時(shí)間的緩存,服務(wù)器端接收到If-Modified-Since頭后則判斷客戶(hù)端緩存的這份url地址的緩存是否是最新的,如果是最新的則服務(wù)器端直接給客戶(hù)端返回HttpStatus 304,意思是說(shuō)這個(gè)內(nèi)容在你上次請(qǐng)求之后沒(méi)有變化過(guò),你直接用緩存就可以了;如果服務(wù)器發(fā)現(xiàn)url的最后更新時(shí)間比If-Modified-Since的值要新,則會(huì)輸出新的內(nèi)容。
同樣微軟也為我們做了服務(wù)器端設(shè)置的封裝,我們可以這樣調(diào)用
Response.Cache.SetLastModified(DateTime)
Response.Cache.SetLastModifiedFromFileDependencies()
如果有更復(fù)雜的需求就需要自己處理了。
4. ETag/If-None-Match
ETag和Last-Modified類(lèi)似,不過(guò)他發(fā)送的是一個(gè)字符串來(lái)標(biāo)示url的版本,如果url變了則此標(biāo)示也跟著變化,在瀏覽器發(fā)送If-None-Match時(shí)告訴瀏覽器內(nèi)容已經(jīng)變了,或者沒(méi)變可以使用緩存。
Iis會(huì)自動(dòng)給靜態(tài)文件加上Etag,在文件發(fā)生改變時(shí)重新生成一個(gè)Etag,這樣對(duì)于一個(gè)網(wǎng)站中的n多個(gè)靜態(tài)文件如:樣式表,小圖片等,客戶(hù)端只下載一次就夠了,可以減輕負(fù)載。
在Asp.Net中我們可以用以下兩個(gè)方法來(lái)設(shè)置
Response.Cache.SetETag(string)
Response.Cache.SetETagFromFileDependencies()
盡管微軟為我們做了很多封裝,但是我們還是需要詳細(xì)的了解之后才可以用好這幾個(gè)Http頭。
微軟在OutputCacheModule中對(duì)這些緩存用到的Http頭給我們進(jìn)行了很好的封裝,但是了解這些Http頭可以更靈活的使用它們。
和客戶(hù)端緩存相關(guān)的Http頭有以下幾個(gè),分別是:
1. Expires:+過(guò)期時(shí)間
表示在指定時(shí)間后瀏覽器緩存失效,需要注意的是這兒的過(guò)期時(shí)間必須是HTTP格式的日期時(shí)間,其他的都會(huì)被解析成當(dāng)前時(shí)間“之前”,緩存會(huì)馬上過(guò)期,HTTP的日期時(shí)間必須是格林威治時(shí)間(GMT),而不是本地時(shí)間。舉例:
復(fù)制代碼 代碼如下:
Expires: Fri, 30 Oct 2009 14:19:41
使用Expires過(guò)期必須要求服務(wù)器的時(shí)間是正確的,否則發(fā)送的http頭就會(huì)出問(wèn)題,在windows服務(wù)下可以設(shè)置時(shí)間服務(wù)器來(lái)同步時(shí)間。
2. Cache-control:
Cache-control直譯成中文就是緩存控制,它的作用就是緩存控制,這個(gè)http頭的值有幾種。
1) max-age=[秒] — 執(zhí)行緩存被認(rèn)為是最新的最長(zhǎng)時(shí)間。類(lèi)似于過(guò)期時(shí)間,這個(gè)參數(shù)是基于請(qǐng)求時(shí)間的相對(duì)時(shí)間間隔,而不是絕對(duì)過(guò)期時(shí)間,[秒]是一個(gè)數(shù)字,單位是秒:從請(qǐng)求時(shí)間開(kāi)始到過(guò)期時(shí)間之間的秒數(shù)。
2) s-maxage=[秒] — 類(lèi)似于max-age屬性,除了他應(yīng)用于共享(如:代理服務(wù)器)緩存
3) public — 標(biāo)記認(rèn)證內(nèi)容也可以被緩存,一般來(lái)說(shuō): 經(jīng)過(guò)HTTP認(rèn)證才能訪問(wèn)的內(nèi)容,輸出是自動(dòng)不可以緩存的;
4) no-cache — 強(qiáng)制每次請(qǐng)求直接發(fā)送給源服務(wù)器,而不經(jīng)過(guò)本地緩存版本的校驗(yàn)。這對(duì)于需要確認(rèn)認(rèn)證應(yīng)用很有用(可以和public結(jié)合使用),或者嚴(yán)格要求使用最新數(shù)據(jù)的應(yīng)用(不惜犧牲使用緩存的所有好處);
5) no-store — 強(qiáng)制緩存在任何情況下都不要保留任何副本
6) must-revalidate — 告訴緩存必須遵循所有你給予副本的新鮮度的,HTTP允許緩存在某些特定情況下返回過(guò)期數(shù)據(jù),指定了這個(gè)屬性,你高速緩存,你希望嚴(yán)格的遵循你的規(guī)則。
7) proxy-revalidate — 和 must-revalidate類(lèi)似,除了他只對(duì)緩存代理服務(wù)器起作用
舉例:
復(fù)制代碼 代碼如下:
Cache-Control: max-age=3600, must-revalidate
很顯然Cache-control可以提供比Expires更靈活的緩存控制,而且它不需要依賴(lài)于服務(wù)器時(shí)間。
在Asp.Net中微軟把對(duì)Cache-control屬性的設(shè)置封裝到了HttpCachePolicy類(lèi)中,我們可以通過(guò)Response.Cache來(lái)調(diào)用以下方法來(lái)做到對(duì)Cache-Control Http頭值的控制:
復(fù)制代碼 代碼如下:
Response.CacheControl;
Response.Cache.SetNoStore
Response.Cache.SetMaxAge
Response.Cache.SetProxyMaxAge
Response.Cache.SetRevalidation
3. Last-Modified/If-Modified-Since
這兩個(gè)Http頭是一對(duì),前者表示某個(gè)地址的最近更新時(shí)間,是服務(wù)器端響應(yīng)給客戶(hù)端的;而后者是客戶(hù)端瀏覽器發(fā)送給服務(wù)器的,告訴web服務(wù)器客戶(hù)端有一個(gè)最后更改時(shí)間為什么時(shí)間的緩存,服務(wù)器端接收到If-Modified-Since頭后則判斷客戶(hù)端緩存的這份url地址的緩存是否是最新的,如果是最新的則服務(wù)器端直接給客戶(hù)端返回HttpStatus 304,意思是說(shuō)這個(gè)內(nèi)容在你上次請(qǐng)求之后沒(méi)有變化過(guò),你直接用緩存就可以了;如果服務(wù)器發(fā)現(xiàn)url的最后更新時(shí)間比If-Modified-Since的值要新,則會(huì)輸出新的內(nèi)容。
同樣微軟也為我們做了服務(wù)器端設(shè)置的封裝,我們可以這樣調(diào)用
復(fù)制代碼 代碼如下:
Response.Cache.SetLastModified(DateTime)
Response.Cache.SetLastModifiedFromFileDependencies()
如果有更復(fù)雜的需求就需要自己處理了。
4. ETag/If-None-Match
ETag和Last-Modified類(lèi)似,不過(guò)他發(fā)送的是一個(gè)字符串來(lái)標(biāo)示url的版本,如果url變了則此標(biāo)示也跟著變化,在瀏覽器發(fā)送If-None-Match時(shí)告訴瀏覽器內(nèi)容已經(jīng)變了,或者沒(méi)變可以使用緩存。
Iis會(huì)自動(dòng)給靜態(tài)文件加上Etag,在文件發(fā)生改變時(shí)重新生成一個(gè)Etag,這樣對(duì)于一個(gè)網(wǎng)站中的n多個(gè)靜態(tài)文件如:樣式表,小圖片等,客戶(hù)端只下載一次就夠了,可以減輕負(fù)載。
在Asp.Net中我們可以用以下兩個(gè)方法來(lái)設(shè)置
復(fù)制代碼 代碼如下:
Response.Cache.SetETag(string)
Response.Cache.SetETagFromFileDependencies()
盡管微軟為我們做了很多封裝,但是我們還是需要詳細(xì)的了解之后才可以用好這幾個(gè)Http頭。
您可能感興趣的文章:
- ASP.NET Core 1.0 部署 HTTPS(.NET Core 1.0)
- 運(yùn)行asp.net時(shí)出現(xiàn) http錯(cuò)誤404-文件或目錄未找到
- Asp.net XMLHTTP封裝類(lèi)(GET,Post發(fā)送和接收數(shù)據(jù))
- asp.net HttpWebRequest自動(dòng)識(shí)別網(wǎng)頁(yè)編碼
- asp.net 模擬提交有文件上傳的表單(通過(guò)http模擬上傳文件)
- Javascript+XMLHttpRequest+asp.net無(wú)刷新讀取數(shù)據(jù)庫(kù)數(shù)據(jù)
- asp.net利用HttpModule實(shí)現(xiàn)防sql注入
- asp.net通過(guò)HttpModule自動(dòng)在Url地址上添加參數(shù)
- ASP.NET MVC Web API HttpClient簡(jiǎn)介
- ASP.NET Core Kestrel 中使用 HTTPS (SSL)
相關(guān)文章
.Net Core中使用Quartz.Net實(shí)踐記錄
Quartz.NET是一套很好的任務(wù)調(diào)度框架。下面這篇文章主要給大家介紹了關(guān)于.Net Core中使用Quartz.Net的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09VS2010發(fā)布Web網(wǎng)站技術(shù)攻略
本篇文章主要包含了完整的發(fā)布網(wǎng)站步驟、發(fā)布網(wǎng)站過(guò)程中可能遇到的問(wèn)題,以及配套的解決方法,相信感興趣的朋友一定會(huì)喜歡這篇文章的2015-07-07.net WINFORM的GDI雙緩沖的實(shí)現(xiàn)方法
下面小編就為大家分享一篇.net WINFORM的GDI雙緩沖的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12.Net中實(shí)現(xiàn)無(wú)限分類(lèi)的2個(gè)例子
這篇文章主要介紹了.Net中實(shí)現(xiàn)無(wú)限分類(lèi)的2個(gè)例子,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-02-02