ASP.NET MVC中使用jQuery時的瀏覽器緩存問題詳解
來源:易賢網 閱讀:841 次 日期:2016-08-05 15:31:18
溫馨提示:易賢網小編為您整理了“ASP.NET MVC中使用jQuery時的瀏覽器緩存問題詳解”,方便廣大網友查閱!

這篇文章主要介紹了ASP.NET MVC中使用jQuery時的瀏覽器緩存問題詳解,需要的朋友可以參考下。

介紹

盡管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請求的緩存技術了吧,我就不做總結了。

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

更多信息請查看網絡編程
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
未满十八18勿进黄网站免费看