溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ASP.NET如何進行內(nèi)置HttpCachePolicy

發(fā)布時間:2021-10-28 16:01:32 來源:億速云 閱讀:121 作者:柒染 欄目:編程語言

ASP.NET如何進行內(nèi)置HttpCachePolicy,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

頁面緩存

在ASP.NET中,如果你需要添加HTTP屬性,可以使用HttpResponse.AppendHeader方法,例如在Page的代碼中直接執(zhí)行Response.AppendHeader。HttpResponse.AddHeader方法是與之等效的,不過僅用于與ASP代碼兼容,所以我的建議你***不要使用。通過AppendHeader方法,你可以將上述Last-Modified屬性和ETag屬性寫入返回中。

接著我們考慮如何從請求中讀上述屬性然后判斷如何返回。我們可以使用HttpRequest.ServerVariables讀取請求中的屬性,然后和當前的值比較,如果比較結(jié)果表明內(nèi)容無變化,我們就可以設(shè)置HttpResponse.StatusCode為304,然后返回空內(nèi)容;如果比較結(jié)果表明內(nèi)容變化了,那就還是按一般的方式完成整個返回。

這很麻煩,對吧?所以ASP.NET內(nèi)置HttpCachePolicy類,讓我們可以直接控制有關(guān)屬性,我們可以通過HttpResponse.Cache訪問此類的實例,而如果在Page中我們可以直接通過 Reponse.Cache訪問它。這個類的使用方式在MSDN中有詳細的描述,所以我就不再解釋了。由于它的實現(xiàn)也依靠上述HTTP屬性,所以使用 AppendHeader控制上述屬性時,就會破壞掉HttpCachePolicy中的設(shè)置(如果你設(shè)置了的話)。因此直接使用AppendHeader與通過HttpCachePolicy間接控制這兩個方法中,同一時間***僅用其中的一個,如果你需要靈活性就使用前者,如果你需要簡單設(shè)置就是用后者。

資源緩存

ASP.NET內(nèi)置HttpCachePolicy和Cache,這讓Page的緩存已經(jīng)足夠方便,所以讓我們來看一看非Page該怎么緩存。事實上資源文件(例如js和css)的***可能請求數(shù)量比Page要多得多,因為一個Page通常鏈接幾個資源文件。

編譯嵌入資源

我們先來看看編譯控件是如何緩存資源的。系統(tǒng)自帶的很多控件都是帶有資源的,因為他們需要這些小圖片、腳本或樣式來確保它們的正常運行,這些資源編譯時選擇為嵌入到dll中,之后無論控件發(fā)布到哪都會附帶有這些資源。這些嵌入到dll中的資源以特定的形式引用,在控件呈現(xiàn)為HTML代碼時就成了 WebResource.axd開頭鏈接,例如:

<script src="/WebResource.axd?d=7wVzVzBOs3_HEjhM5umRSQ2&amp;t=632962899860156250" type="text/javascript"> </script>

WebResource.axd注冊為由AssemblyResourceLoader處理,這個IHttpHandler專門負責(zé)從dll中將資源文件提取出來,然后返回給客戶端。

留意WebResource.axd后面的兩個參數(shù),d是資源的標示,它表明了當前請求的是哪個資源;t是該dll***編譯的時間戳,如果dll重新編譯了t就會跟著改變,這就讓瀏覽器知道這是一個新的URL,不應(yīng)該再使用原來的緩存。

需要強調(diào)的是,這并非是一個具有兼容性的做法,它只能確保資源更新時緩存過期,但不能確保沒更新的資源成功緩存。根據(jù)RFC2616,瀏覽器操作分為安全與不安全兩類,GET和HEAD應(yīng)該是安全的,因為除了獲取信息它們不對外界造成任何影響;POST、PUT以及DELETE是不安全的,因為它們對外界造成影響,所以你刷新POST后的頁面時瀏覽器會提示你是否確認再次提交數(shù)據(jù)。RFC2616中提到,對于安全操作除非服務(wù)器端顯式聲明過期,否則客戶端有權(quán)直接取緩存來顯示,因為無論客戶端是從服務(wù)期端取還是從緩存取都應(yīng)該是不對外界造成任何影響的,然而有一種情況除外——就是當URL中存在QueryString時。

當URL中存在QueryString時,這個請求被認為是可能對外界造成影響的,所以當客戶端進行這個請求時必須通過服務(wù)器端完成,也就是不允許使用緩存。RFC2616如是說了,但并非每一個瀏覽器都如此做了。IE和Firefox違反RFC2616對有QueryString的URL進行緩存,而Opera和Safari則遵守此規(guī)矩每次重新獲取內(nèi)容。也就是說,ASP.NET的這種資源地址在Opera和Safari中是決不會被緩存的,例如你的ASP.NET應(yīng)用在MasterPage使用了ASP.NET AJAX的ScriptManager,那么打開每個頁面時有關(guān)的腳本文件都要從新下載。

非編譯嵌入資源

如果我們當前在寫一個ASP.NET網(wǎng)站,有些資源是直接以文件形式存在的,不是編譯嵌入到dll中的,那么我們就沒辦法享受上述系統(tǒng)提供的便利了,但我們可以自己實現(xiàn)類似的機制,并避免上述某些瀏覽器不緩存資源的問題。以上介紹ASP.NET內(nèi)置HttpCachePolicy

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI