您好,登錄后才能下訂單哦!
小編給大家分享一下ASP.NET MVC中使用jQuery時瀏覽器緩存問題的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
介紹
盡管jQuery在瀏覽器ajax調(diào)用的時候對緩存提供了很好的支持,還是有必要了解一下如何高效地使用http協(xié)議。
首先要做的事情是在服務器端支持HTTP GET,定義不同的URL輸出不同的數(shù)據(jù)(MVC里對應的就是action)。如果要使用同一個地址獲取不同的數(shù)據(jù),那就不對了,一個HTTP POST也不行因為POST不能被緩存。許多開發(fā)人員使用POST主要有2個原因:明確了數(shù)據(jù)不能被緩存,或者是避免JSON攻擊(JSON返回數(shù)組的時候可以被入侵)。
緩存解釋
jQuery全局對象里的ajax方法提供了一些options來支持緩存和Conditional GETs功能。
$.ajax({ ifModified: [true|false], cache: [true|false], });
ifModified選項定義的是在ajax調(diào)用的時候是否支持Conditional GETs功能。jQuery會自動幫我們處理服務器端返回的名為Last-Modified的header值,然后在隨后的請求里的header里發(fā)送If-Modified-Since。這需要我們的MVC Controller要實現(xiàn)Conditional GETs功能才能用。Conditional GETs功能在http緩存上下文中用于重新驗證緩存中過期的條目。如果jQuery認為一個條目已經(jīng)過期了,它首先會請求服務器使用Conditional GETs功能重新驗證該條目,如果服務器返回狀態(tài)碼304(Not modified),jQuery會重新使用緩存里的該項目,這樣的話,我們可以節(jié)約很多流量去下載頁面內(nèi)容。
cache選項基本上是覆蓋服務器端返回的http header里的所有關于緩存的設置,如果設置cache選項為false的話,jQuery會在請求的URL后面附件一個時間戳,以便區(qū)分之前的URL地址,這樣沒錯請求的內(nèi)容都是最新的,也就是說瀏覽器每次接收的都是新地址,自然返回的都是最新數(shù)據(jù)。
讓我們來看幾個場景:
服務器端響應里設置No-Cache
服務器端為王,如果服務器端明確定義了response響應不能被緩存的話,jQuery也無能為力。ajax里的cache選項將被忽略。
JS代碼:
$('#nocache').click(function () { $.ajax({ url: '/Home/NoCache', ifModified: false, cache: true, success: function (data, status, xhr) { $('#content').html(data.count); } }); });
C#代碼:
public ActionResult NoCache() { // 禁用緩存 Response.Cache.SetCacheability(HttpCacheability.NoCache); return Json(new { count = Count++ }, JsonRequestBehavior.AllowGet); }
服務器端響應里設置過期時間
服務器端設置過期時間用于緩存數(shù)據(jù),該條目在客戶端將依據(jù)過期時間被緩存。
JS代碼:
$('#expires').click(function () { $.ajax({ url: '/Home/Expires', ifModified: false, cache: true, success: function (data, status, xhr) { $('#content').html(data.count); } }); });
C#代碼:
public ActionResult Expires() { Response.Cache.SetExpires(DateTime.Now.AddSeconds(5)); return Json(new { count = Count++ }, JsonRequestBehavior.AllowGet); }
客戶端從來不緩存數(shù)據(jù)
客戶端決定每次都要最新的數(shù)據(jù)(不能使用緩存),也就是說ajaxi里的cache選項設置為false,不管服務器端如何定義,jQuery每次請求的URL地址都是唯一不同的,目的是每次都獲取最新的內(nèi)容。
JS代碼:
$('#expires_nocache').click(function () { $.ajax({ url: '/Home/Expires', ifModified: false, cache: false, // 這里是關鍵 success: function (data, status, xhr) { $('#content').html(data.count); } }); });
C#代碼:
public ActionResult Expires() { // 不管服務器端怎么設置都沒用 Response.Cache.SetExpires(DateTime.Now.AddSeconds(5)); return Json(new { count = Count++ }, JsonRequestBehavior.AllowGet); }
服務器端和客戶端使用Conditional Gets功能驗證緩存數(shù)據(jù)
客戶端將條目放在緩存里,在過期之后重新驗證。服務器端必須實現(xiàn)Conditional GET功能(使用ETags或者last modified的header)。
JS代碼:
$('#expires_conditional').click(function () { $.ajax({ url: '/Home/ExpiresWithConditional', ifModified: true, // 這里是關鍵 cache: true, success: function (data, status, xhr) { $('#content').html(data.count); } }); });
C#代碼:
public ActionResult ExpiresWithConditional() { if (Request.Headers["If-Modified-Since"] != null && Count % 2 == 0) { return new HttpStatusCodeResult((int)HttpStatusCode.NotModified); } Response.Cache.SetExpires(DateTime.Now.AddSeconds(5)); Response.Cache.SetLastModified(DateTime.Now); return Json(new { count = Count++ }, JsonRequestBehavior.AllowGet); }
上述MVC action中的代碼只是一個例子(非真實代碼),在真實的實現(xiàn)中,服務器端應該能夠知道數(shù)據(jù)自從上次響應以后是否被修改過。
以上是“ASP.NET MVC中使用jQuery時瀏覽器緩存問題的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。