<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      大叔手記(20):ASP.NET MVC中使用jQuery時(shí)的瀏覽器緩存問題

      2012-02-16 14:49  湯姆大叔  閱讀(9392)  評論(11)    收藏  舉報(bào)

      介紹

      盡管jQuery在瀏覽器ajax調(diào)用的時(shí)候?qū)彺嫣峁┝撕芎玫闹С?,還是有必要了解一下如何高效地使用http協(xié)議。

      首先要做的事情是在服務(wù)器端支持HTTP GET,定義不同的URL輸出不同的數(shù)據(jù)(MVC里對應(yīng)的就是action)。如果要使用同一個地址獲取不同的數(shù)據(jù),那就不對了,一個HTTP POST也不行因?yàn)镻OST不能被緩存。許多開發(fā)人員使用POST主要有2個原因:明確了數(shù)據(jù)不能被緩存,或者是避免JSON攻擊(JSON返回?cái)?shù)組的時(shí)候可以被入侵)。

      緩存解釋

      jQuery全局對象里的ajax方法提供了一些options來支持緩存和Conditional GETs功能。

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

      ifModified選項(xiàng)定義的是在ajax調(diào)用的時(shí)候是否支持Conditional GETs功能。jQuery會自動幫我們處理服務(wù)器端返回的名為Last-Modified的header值,然后在隨后的請求里的header里發(fā)送If-Modified-Since。這需要我們的MVC Controller要實(shí)現(xiàn)Conditional GETs功能才能用。Conditional GETs功能在http緩存上下文中用于重新驗(yàn)證緩存中過期的條目。如果jQuery認(rèn)為一個條目已經(jīng)過期了,它首先會請求服務(wù)器使用Conditional GETs功能重新驗(yàn)證該條目,如果服務(wù)器返回狀態(tài)碼304(Not modified),jQuery會重新使用緩存里的該項(xiàng)目,這樣的話,我們可以節(jié)約很多流量去下載頁面內(nèi)容。

      cache選項(xiàng)基本上是覆蓋服務(wù)器端返回的http header里的所有關(guān)于緩存的設(shè)置,如果設(shè)置cache選項(xiàng)為false的話,jQuery會在請求的URL后面附件一個時(shí)間戳,以便區(qū)分之前的URL地址,這樣沒錯請求的內(nèi)容都是最新的,也就是說瀏覽器每次接收的都是新地址,自然返回的都是最新數(shù)據(jù)。

      讓我們來看幾個場景:

      服務(wù)器端響應(yīng)里設(shè)置No-Cache

      服務(wù)器端為王,如果服務(wù)器端明確定義了response響應(yīng)不能被緩存的話,jQuery也無能為力。ajax里的cache選項(xiàng)將被忽略。

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

      服務(wù)器端響應(yīng)里設(shè)置過期時(shí)間

      服務(wù)器端設(shè)置過期時(shí)間用于緩存數(shù)據(jù),該條目在客戶端將依據(jù)過期時(shí)間被緩存。

      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選項(xiàng)設(shè)置為false,不管服務(wù)器端如何定義,jQuery每次請求的URL地址都是唯一不同的,目的是每次都獲取最新的內(nèi)容。

      JS代碼:

      $('#expires_nocache').click(function () {
      $.ajax({
      url: '/Home/Expires',
      ifModified: false,
      cache: false, // 這里是關(guān)鍵
      success: function (data, status, xhr) {
      $('#content').html(data.count);
      }
      });
      });

      C#代碼:

      public ActionResult Expires()
      {
      // 不管服務(wù)器端怎么設(shè)置都沒用
      Response.Cache.SetExpires(DateTime.Now.AddSeconds(5));
      return Json(new { count = Count++ }, JsonRequestBehavior.AllowGet);
      }

      服務(wù)器端和客戶端使用Conditional Gets功能驗(yàn)證緩存數(shù)據(jù)

      客戶端將條目放在緩存里,在過期之后重新驗(yàn)證。服務(wù)器端必須實(shí)現(xiàn)Conditional GET功能(使用ETags或者last modified的header)。

      JS代碼:

      $('#expires_conditional').click(function () {
      $.ajax({
      url: '/Home/ExpiresWithConditional',
      ifModified: true, // 這里是關(guān)鍵
      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中的代碼只是一個例子(非真實(shí)代碼),在真實(shí)的實(shí)現(xiàn)中,服務(wù)器端應(yīng)該能夠知道數(shù)據(jù)自從上次響應(yīng)以后是否被修改過。

      總結(jié)

      詳細(xì)通過這4個場景,大家應(yīng)該了解了ajax請求的緩存技術(shù)了吧,我就不做總結(jié)了。

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

      同步與推薦

      本文已同步至目錄索引:《大叔手記全集》

      大叔手記:旨在記錄日常工作中的各種小技巧與資料(包括但不限于技術(shù)),如對你有用,請推薦一把,給大叔寫作的動力。

      主站蜘蛛池模板: 亚洲综合黄色的在线观看| 51午夜精品免费视频| 69精品丰满人妻无码视频a片| 亚洲av无码之国产精品网址蜜芽| 99精品日本二区留学生| 国产成人精品日本亚洲专区6| 日韩国产精品中文字幕| 一本久道中文无码字幕av| 国产精品 视频一区 二区三区| 怡红院一区二区三区在线| 99久久精品国产一区色| www欧美在线观看| 精品国产乱码久久久久APP下载| 亚洲综合色网一区二区三区| 男女啪啪高潮激烈免费版| 亚洲av成人一区二区三区| 久久精品久久电影免费理论片| 精品人妻伦九区久久aaa片69| 不卡在线一区二区三区视频| 国产精品福利自产拍在线观看| 国产日韩综合av在线| 国产精品日韩中文字幕熟女| 成人做爰www网站视频| 中文字幕日韩国产精品| 老司机亚洲精品一区二区| 九色精品国产亚洲av麻豆一| 最新亚洲人成网站在线观看| 男女爽爽无遮挡午夜视频| 中文www天堂| 国产无遮挡真人免费视频| 亚洲人妻精品中文字幕| 电白县| 一区二区在线观看 激情| 99久久99这里只有免费费精品 | 国产色悠悠视频在线观看| 日本一区二区三区专线| 国产成人精品一区二区三区| 伊人天天久大香线蕉av色| 中文字幕少妇人妻精品| 国产女人喷潮视频免费| 中文字幕在线日韩|