您好,登錄后才能下訂單哦!
ASP.NET如何進行內置HttpCachePolicy,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
頁面緩存
在ASP.NET中,如果你需要添加HTTP屬性,可以使用HttpResponse.AppendHeader方法,例如在Page的代碼中直接執行Response.AppendHeader。HttpResponse.AddHeader方法是與之等效的,不過僅用于與ASP代碼兼容,所以我的建議你***不要使用。通過AppendHeader方法,你可以將上述Last-Modified屬性和ETag屬性寫入返回中。
接著我們考慮如何從請求中讀上述屬性然后判斷如何返回。我們可以使用HttpRequest.ServerVariables讀取請求中的屬性,然后和當前的值比較,如果比較結果表明內容無變化,我們就可以設置HttpResponse.StatusCode為304,然后返回空內容;如果比較結果表明內容變化了,那就還是按一般的方式完成整個返回。
這很麻煩,對吧?所以ASP.NET內置HttpCachePolicy類,讓我們可以直接控制有關屬性,我們可以通過HttpResponse.Cache訪問此類的實例,而如果在Page中我們可以直接通過 Reponse.Cache訪問它。這個類的使用方式在MSDN中有詳細的描述,所以我就不再解釋了。由于它的實現也依靠上述HTTP屬性,所以使用 AppendHeader控制上述屬性時,就會破壞掉HttpCachePolicy中的設置(如果你設置了的話)。因此直接使用AppendHeader與通過HttpCachePolicy間接控制這兩個方法中,同一時間***僅用其中的一個,如果你需要靈活性就使用前者,如果你需要簡單設置就是用后者。
資源緩存
ASP.NET內置HttpCachePolicy和Cache,這讓Page的緩存已經足夠方便,所以讓我們來看一看非Page該怎么緩存。事實上資源文件(例如js和css)的***可能請求數量比Page要多得多,因為一個Page通常鏈接幾個資源文件。
編譯嵌入資源
我們先來看看編譯控件是如何緩存資源的。系統自帶的很多控件都是帶有資源的,因為他們需要這些小圖片、腳本或樣式來確保它們的正常運行,這些資源編譯時選擇為嵌入到dll中,之后無論控件發布到哪都會附帶有這些資源。這些嵌入到dll中的資源以特定的形式引用,在控件呈現為HTML代碼時就成了 WebResource.axd開頭鏈接,例如:
<script src="/WebResource.axd?d=7wVzVzBOs3_HEjhM5umRSQ2&t=632962899860156250" type="text/javascript"> </script>
WebResource.axd注冊為由AssemblyResourceLoader處理,這個IHttpHandler專門負責從dll中將資源文件提取出來,然后返回給客戶端。
留意WebResource.axd后面的兩個參數,d是資源的標示,它表明了當前請求的是哪個資源;t是該dll***編譯的時間戳,如果dll重新編譯了t就會跟著改變,這就讓瀏覽器知道這是一個新的URL,不應該再使用原來的緩存。
需要強調的是,這并非是一個具有兼容性的做法,它只能確保資源更新時緩存過期,但不能確保沒更新的資源成功緩存。根據RFC2616,瀏覽器操作分為安全與不安全兩類,GET和HEAD應該是安全的,因為除了獲取信息它們不對外界造成任何影響;POST、PUT以及DELETE是不安全的,因為它們對外界造成影響,所以你刷新POST后的頁面時瀏覽器會提示你是否確認再次提交數據。RFC2616中提到,對于安全操作除非服務器端顯式聲明過期,否則客戶端有權直接取緩存來顯示,因為無論客戶端是從服務期端取還是從緩存取都應該是不對外界造成任何影響的,然而有一種情況除外——就是當URL中存在QueryString時。
當URL中存在QueryString時,這個請求被認為是可能對外界造成影響的,所以當客戶端進行這個請求時必須通過服務器端完成,也就是不允許使用緩存。RFC2616如是說了,但并非每一個瀏覽器都如此做了。IE和Firefox違反RFC2616對有QueryString的URL進行緩存,而Opera和Safari則遵守此規矩每次重新獲取內容。也就是說,ASP.NET的這種資源地址在Opera和Safari中是決不會被緩存的,例如你的ASP.NET應用在MasterPage使用了ASP.NET AJAX的ScriptManager,那么打開每個頁面時有關的腳本文件都要從新下載。
非編譯嵌入資源
如果我們當前在寫一個ASP.NET網站,有些資源是直接以文件形式存在的,不是編譯嵌入到dll中的,那么我們就沒辦法享受上述系統提供的便利了,但我們可以自己實現類似的機制,并避免上述某些瀏覽器不緩存資源的問題。以上介紹ASP.NET內置HttpCachePolicy
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。