在預設情況下,IE會針對請求位址緩存Ajax請求的結果。換句話說,在緩存過期之前,針對相同位址發起的多個Ajax請求,隻有第一次會真正發送到服務端。在某些情況下,這種預設的緩存機制并不是我們希望的(比如擷取實時資料),這篇文章就來簡單地讨論這個問題,以及介紹幾種解決方案。
目錄 一、問題重制 二、通過為URL位址添加字尾的方式解決問題 三、通過JQuery的Ajax設定解決問題 四、通過定制響應解決問題
我們通過一個ASP.NET MVC應用來重制IE針對Ajax請求結果的緩存。在一個空ASP.NET MVC應用中我們定義了如下一個預設的HomeController,其中包含一個傳回目前時間的Action方法GetCurrentTime。
預設Action方法Index對應的View定義如下。我們每隔5秒鐘利用JQuery的方法以Ajax的方式調用GetCurrentTime操作,并将傳回的結果顯示出來。
采用不同的浏覽器運作該程式會得到不同的輸出結果,如下圖所示,Chrome浏覽器中能夠顯示出實時時間,但是在IE中顯示的時間都是相同的。

由于IE針對Ajax請求的傳回的結果是根據請求位址進行緩存的,是以如果不希望這個緩存機制生效,我們可以在每次請求時為請求位址添加不同的字尾來解決這個問題。針對這個例子,我們通過如下的代碼為請求位址添加一個基于目前時間的查詢字元串,再次運作程式後IE中将會顯示實時的時間。
實際上jQuery具有針對這個的Ajax設定,我們隻需要按照如下的方式調用$.ajaxSetup方法禁止掉Ajaz的緩存機制。
實際上jQuery的這個機制也是通過為請求位址添加不同的查詢字元串字尾來實作的,這可以通過Fiddler攔截的請求來證明。
我們可以通過請求的響應來控制浏覽器針對結果的緩存,為此我們定義了如下一個名為NoCacheAttribute的ActionFilter。在實作的OnActionExecuted方法中,我們調用目前HttpResponse的SetCacheability方法将緩存選項設定為NoCache。該NoCacheAttribute特性被應用到GetCurrentTime方法後,運作我們的程式在IE中依然可以得到實時的時間。
實際NoCacheAttribute特性最終控制消息消息的Cache-Control報頭,并将其設定為“no-cache”,訓示浏覽器不要對結果進行緩存。如下所示的是針對GetCurrentTime請求的響應消息:
作者:蔣金楠
微信公衆賬号:大内老A
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識别二維碼)關注個人公衆号(原來公衆帳号蔣金楠的自媒體将會停用)。
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。
<a href="http://www.cnblogs.com/artech/archive/2013/01/03/cache-4-ie.html" target="_blank">原文連結</a>