我們透過一個ASP.NET MVC應用程式來重現IE針對Ajax請求結果的快取。在一個空ASP.NET MVC應用程式中我們定義瞭如下一個預設的HomeController,其中包含一個傳回目前時間的Action方法GetCurrentTime。
在預設情況下,IE會針對請求位址快取Ajax請求的結果。換句話說,在快取過期之前,針對相同位址發起的多個Ajax請求,只有第一次會真正傳送到服務端。在某些情況下,這種預設的快取機制並不是我們希望的(例如取得即時數據),這篇文章就來簡單地討論這個問題,以及介紹幾種解決方案。
目錄
一、問題重現
二、透過為URL地址添加後綴的方式解決問題
三、透過JQuery的Ajax設定解決問題
##四、透過定制回應解決問題
一、問題重現
我們透過一個ASP.NET MVC應用程式來重現IE針對Ajax請求結果的快取。在一個空ASP.NET MVC應用程式中我們定義瞭如下一個預設的HomeController,其中包含一個傳回目前時間的Action方法GetCurrentTime。public class HomeController Controller { public ActionResult Index() { return View(); } public string GetCurrentTime() { return DateTime.Now.ToLongTimeString(); } }預設Action方法Index對應的View定義如下。我們每隔5秒鐘利用JQuery的方法以Ajax的方式呼叫GetCurrentTime操作,並將傳回的結果顯示出來。
<!DOCTYPE html> <html> <head> <title>@ViewBag.Title</title> <script type="text/javascript" src="@Url.Coutent(“~/Scripts/jquery-...min.js”)"></script> <script type="text/javascript"> $(function () { window.setInterval(function () { $.ajax({ url'@Url.Action("GetCurrentTime")', success function (result) { $("ul").append("<li>" + result + "</li>"); } }); }, ); }); </script> </head> <body> <ul></ul> </body> </html>採用不同的瀏覽器執行程式會得到不同的輸出結果,如下圖所示,Chrome瀏覽器中能夠顯示出即時時間,但是在IE中顯示的時間都是相同的。
二、透過為URL位址新增後綴的方式解決問題
<!DOCTYPE html> <html> <head> <script type="text/javascript"> $(function () { window.setInterval(function () { $.ajax({ url'@Url.Action("GetCurrentTime")?'+ new Date().toTimeString() , success function (result) { $("ul").append("<li>" + result + "</li>"); } }); }, ); }); </script> </head> </html>
三、透過jQuery的Ajax設定解決問題
實際上jQuery有針對這個的Ajax設置,我們只需要按照如下的方式呼叫$.ajaxSetup方法禁止掉Ajaz的快取機制。<!DOCTYPE html> <html> <head> <script type="text/javascript"> $(function () { $.ajaxSetup({ cache false }); window.setInterval(function () { $.ajax({ url'@Url.Action("GetCurrentTime")', success function (result) { $("ul").append("<li>" + result + "</li>"); } }); }, ); }); </script> </head> </html>實際上jQuery的這個機制也是透過為請求位址添加不同的查詢字串後綴來實現的,這可以透過Fiddler攔截的請求來證實。
四、透過自訂回應解決問題
#我們可以透過請求的回應來控制瀏覽器針對結果的緩存,為此我們定義如下一個名為NoCacheAttribute的ActionFilter。在實作的OnActionExecuted方法中,我們呼叫目前HttpResponse的SetCacheability方法將快取選項設為NoCache。該NoCacheAttribute特性被應用到GetCurrentTime方法後,運行我們的程式在IE中仍可以獲得即時的時間。public class HomeController Controller { public ActionResult Index() { return View(); } [NoCache] public string GetCurrentTime() { return DateTime.Now.ToLongTimeString(); } } public class NoCacheAttribute FilterAttribute, IActionFilter { public void OnActionExecuted(ActionExecutedContext filterContext) { filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); } public void OnActionExecuting(ActionExecutingContext filterContext) {} }實際NoCacheAttribute特性最終控制訊息訊息的Cache-Control報頭,並將其設為“no-cache”,指示瀏覽器不要對結果進行快取.如下圖所示的是針對GetCurrentTime請求的回應訊息:
HTTP/. OK Server ASP.NET Development Server/... Date Thu, Jan GMT X-AspNet-Version .. X-AspNetMvc-Version . Cache-Control no-cache Pragma no-cache Expires - Content-Type text/html; charset=utf- Content-Length Connection Close PM上面是我整理給大家的,希望今後會對大家有幫助。 相關文章:
##
以上是淺析IE針對Ajax請求結果的快取問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!