新聞中心
頁(yè)面緩存

在ASP.NET中,如果你需要添加HTTP屬性,可以使用HttpResponse.AppendHeader方法,例如在Page的代碼中直接執(zhí)行Response.AppendHeader。HttpResponse.AddHeader方法是與之等效的,不過(guò)僅用于與ASP代碼兼容,所以我的建議你***不要使用。通過(guò)AppendHeader方法,你可以將上述Last-Modified屬性和ETag屬性寫(xiě)入返回中。
接著我們考慮如何從請(qǐng)求中讀上述屬性然后判斷如何返回。我們可以使用HttpRequest.ServerVariables讀取請(qǐng)求中的屬性,然后和當(dāng)前的值比較,如果比較結(jié)果表明內(nèi)容無(wú)變化,我們就可以設(shè)置HttpResponse.StatusCode為304,然后返回空內(nèi)容;如果比較結(jié)果表明內(nèi)容變化了,那就還是按一般的方式完成整個(gè)返回。
這很麻煩,對(duì)吧?所以ASP.NET內(nèi)置HttpCachePolicy類(lèi),讓我們可以直接控制有關(guān)屬性,我們可以通過(guò)HttpResponse.Cache訪問(wèn)此類(lèi)的實(shí)例,而如果在Page中我們可以直接通過(guò) Reponse.Cache訪問(wèn)它。這個(gè)類(lèi)的使用方式在MSDN中有詳細(xì)的描述,所以我就不再解釋了。由于它的實(shí)現(xiàn)也依靠上述HTTP屬性,所以使用 AppendHeader控制上述屬性時(shí),就會(huì)破壞掉HttpCachePolicy中的設(shè)置(如果你設(shè)置了的話)。因此直接使用AppendHeader與通過(guò)HttpCachePolicy間接控制這兩個(gè)方法中,同一時(shí)間***僅用其中的一個(gè),如果你需要靈活性就使用前者,如果你需要簡(jiǎn)單設(shè)置就是用后者。
資源緩存
ASP.NET內(nèi)置HttpCachePolicy和Cache,這讓Page的緩存已經(jīng)足夠方便,所以讓我們來(lái)看一看非Page該怎么緩存。事實(shí)上資源文件(例如js和css)的***可能請(qǐng)求數(shù)量比Page要多得多,因?yàn)橐粋€(gè)Page通常鏈接幾個(gè)資源文件。
編譯嵌入資源
我們先來(lái)看看編譯控件是如何緩存資源的。系統(tǒng)自帶的很多控件都是帶有資源的,因?yàn)樗麄冃枰@些小圖片、腳本或樣式來(lái)確保它們的正常運(yùn)行,這些資源編譯時(shí)選擇為嵌入到dll中,之后無(wú)論控件發(fā)布到哪都會(huì)附帶有這些資源。這些嵌入到dll中的資源以特定的形式引用,在控件呈現(xiàn)為HTML代碼時(shí)就成了 WebResource.axd開(kāi)頭鏈接,例如:
WebResource.axd注冊(cè)為由AssemblyResourceLoader處理,這個(gè)IHttpHandler專(zhuān)門(mén)負(fù)責(zé)從dll中將資源文件提取出來(lái),然后返回給客戶(hù)端。
留意WebResource.axd后面的兩個(gè)參數(shù),d是資源的標(biāo)示,它表明了當(dāng)前請(qǐng)求的是哪個(gè)資源;t是該dll***編譯的時(shí)間戳,如果dll重新編譯了t就會(huì)跟著改變,這就讓瀏覽器知道這是一個(gè)新的URL,不應(yīng)該再使用原來(lái)的緩存。
需要強(qiáng)調(diào)的是,這并非是一個(gè)具有兼容性的做法,它只能確保資源更新時(shí)緩存過(guò)期,但不能確保沒(méi)更新的資源成功緩存。根據(jù)RFC2616,瀏覽器操作分為安全與不安全兩類(lèi),GET和HEAD應(yīng)該是安全的,因?yàn)槌双@取信息它們不對(duì)外界造成任何影響;POST、PUT以及DELETE是不安全的,因?yàn)樗鼈儗?duì)外界造成影響,所以你刷新POST后的頁(yè)面時(shí)瀏覽器會(huì)提示你是否確認(rèn)再次提交數(shù)據(jù)。RFC2616中提到,對(duì)于安全操作除非服務(wù)器端顯式聲明過(guò)期,否則客戶(hù)端有權(quán)直接取緩存來(lái)顯示,因?yàn)闊o(wú)論客戶(hù)端是從服務(wù)期端取還是從緩存取都應(yīng)該是不對(duì)外界造成任何影響的,然而有一種情況除外——就是當(dāng)URL中存在QueryString時(shí)。
當(dāng)URL中存在QueryString時(shí),這個(gè)請(qǐng)求被認(rèn)為是可能對(duì)外界造成影響的,所以當(dāng)客戶(hù)端進(jìn)行這個(gè)請(qǐng)求時(shí)必須通過(guò)服務(wù)器端完成,也就是不允許使用緩存。RFC2616如是說(shuō)了,但并非每一個(gè)瀏覽器都如此做了。IE和Firefox違反RFC2616對(duì)有QueryString的URL進(jìn)行緩存,而Opera和Safari則遵守此規(guī)矩每次重新獲取內(nèi)容。也就是說(shuō),ASP.NET的這種資源地址在Opera和Safari中是決不會(huì)被緩存的,例如你的ASP.NET應(yīng)用在MasterPage使用了ASP.NET AJAX的ScriptManager,那么打開(kāi)每個(gè)頁(yè)面時(shí)有關(guān)的腳本文件都要從新下載。
非編譯嵌入資源
如果我們當(dāng)前在寫(xiě)一個(gè)ASP.NET網(wǎng)站,有些資源是直接以文件形式存在的,不是編譯嵌入到dll中的,那么我們就沒(méi)辦法享受上述系統(tǒng)提供的便利了,但我們可以自己實(shí)現(xiàn)類(lèi)似的機(jī)制,并避免上述某些瀏覽器不緩存資源的問(wèn)題。以上介紹ASP.NET內(nèi)置HttpCachePolicy
【編輯推薦】
- 微軟發(fā)布ASP.NET MVC 2預(yù)覽版 多項(xiàng)功能更新
- ASP.NET服務(wù)器自定義控件安全準(zhǔn)則
- ASP.NET編程規(guī)范之編碼規(guī)范淺析
- 關(guān)于ASP.NET Session的一點(diǎn)認(rèn)識(shí)
- ASP.NET編程工具ASP.NET Web Matrix詳細(xì)介紹
文章題目:概述ASP.NET內(nèi)置HttpCachePolicy
標(biāo)題URL:http://m.fisionsoft.com.cn/article/cdooepd.html


咨詢(xún)
建站咨詢(xún)
