ASP.NET MVC中使用jQuery時的瀏覽器緩衝問題詳解_實用技巧

來源:互聯網
上載者:User

介紹

儘管jQuery在瀏覽器ajax調用的時候對緩衝提供了很好的支援,還是有必要瞭解一下如何高效地使用http協議。

首先要做的事情是在伺服器端支援HTTP GET,定義不同的URL輸出不同的資料(MVC裡對應的就是action)。如果要使用同一個地址擷取不同的資料,那就不對了,一個HTTP POST也不行因為POST不能被緩衝。許多開發人員使用POST主要有2個原因:明確了資料不能被緩衝,或者是避免JSON攻擊(JSON返回數組的時候可以被入侵)。

緩衝解釋

jQuery全域對象裡的ajax方法提供了一些options來支援緩衝和Conditional GETs功能。

$.ajax({  ifModified: [true|false],  cache: [true|false],});

ifModified選項定義的是在ajax調用的時候是否支援Conditional GETs功能。jQuery會自動幫我們處理伺服器端返回的名為Last-Modified的header值,然後在隨後的請求裡的header裡發送If-Modified-Since。這需要我們的MVC Controller要實現Conditional GETs功能才能用。Conditional GETs功能在http緩衝上下文中用於重新驗證緩衝中到期的條目。如果jQuery認為一個條目已經到期了,它首先會請求伺服器使用Conditional GETs功能重新驗證該條目,如果伺服器返回狀態代碼304(Not modified),jQuery會重新使用緩衝裡的該項目,這樣的話,我們可以節約很多流量去下載頁面內容。

cache選項基本上是覆蓋伺服器端返回的http header裡的所有關於緩衝的設定,如果設定cache選項為false的話,jQuery會在請求的URL後面附件一個時間戳記,以便區分之前的URL地址,這樣沒錯請求的內容都是最新的,也就是說瀏覽器每次接收的都是新地址,自然返回的都是最新資料。

讓我們來看幾個情境:

伺服器端響應裡設定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);}

伺服器端響應裡設定到期時間

伺服器端設定到期時間用於快取資料,該條目在用戶端將依據到期時間被緩衝。

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);}

用戶端從來不快取資料

用戶端決定每次都要最新的資料(不能使用緩衝),也就是說ajaxi裡的cache選項設定為false,不管伺服器端如何定義,jQuery每次請求的URL地址都是唯一不同的,目的是每次都擷取最新的內容。

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功能驗證快取資料

用戶端將條目放在緩衝裡,在到期之後重新驗證。伺服器端必須實現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中的代碼只是一個例子(非真實代碼),在真實的實現中,伺服器端應該能夠知道資料自從上次響應以後是否被修改過。

總結

詳細通過這4個情境,大家應該瞭解了ajax請求的緩衝技術了吧,我就不做總結了。

英文原文來自:http://weblogs.asp.net/cibrax/archive/2012/02/10/hacking-the-browser-cache-with-jquery-and-asp-net-mvc.aspx

以上這篇ASP.NET MVC中使用jQuery時的瀏覽器緩衝問題詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援雲棲社區。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.