谈谈IE针对Ajax请求结果的缓存

在默认情况下,IE会针对请求地址缓存Ajax请求的结果。换句话说,在缓存过期之前,针对相同地址发起的多个Ajax请求,只有第一次会真正发送到服务端。在某些情况下,这种默认的缓存机制并不是我们希望的(比如获取实时数据),这篇文章就来简单地讨论这个问题,以及介绍几种解决方案。

成都创新互联公司是一家专业提供曲松企业网站建设,专注与网站设计、成都做网站成都h5网站建设、小程序制作等业务。10年已为曲松众多企业、政府机构等服务。创新互联专业网站设计公司优惠进行中。

一、问题重现

我们通过一个ASP.NET MVC应用来重现IE针对Ajax请求结果的缓存。在一个空ASP.NET MVC应用中我们定义了如下一个默认的HomeController,其中包含一个返回当前时间的Action方法GetCurrentTime。

 
 
 
 
  1.  public class HomeController : Controller
  2.  {
  3.      public ActionResult Index()
  4.     {
  5.        return View();
  6.     }
  7.  
  8.     public string GetCurrentTime()
  9.     {
  10.        return DateTime.Now.ToLongTimeString();
  11.     }
  12. }

默认Action方法Index对应的View定义如下。我们每隔5秒钟利用JQuery的方法以Ajax的方式调用GetCurrentTime操作,并将返回的结果显示出来。

 
 
 
 
  1.     
  2.         @ViewBag.Title  
  3.         
  4.         
  5.             $(function () {
  6.                 window.setInterval(function () {
  7.                    $.ajax({
  8.                        url:'@Url.Action("GetCurrentTime")',
  9.                        success: function (result) {
  10.                           $("ul").append("
  11. " + result + "
  12. ");
  13.                        }
  14.                    });
  15.                }, 5000);
  16.            });
  17.        
  18.    
  19.     
  20.        
    •    

    采用不同的浏览器运行该程序会得到不同的输出结果,如下图所示,Chrome浏览器中能够显示出实时时间,但是在IE中显示的时间都是相同的。

    二、通过为URL地址添加后缀的方式解决问题

    由于IE针对Ajax请求的返回的结果是根据请求地址进行缓存的,所以如果不希望这个缓存机制生效,我们可以在每次请求时为请求地址添加不同的后缀来解决这个问题。针对这个例子,我们通过如下的代码为请求地址添加一个基于当前时间的查询字符串,再次运行程序后IE中将会显示实时的时间。

     
     
     
     
    1.  
    2.  
    3.              
    4.          
    5.              $(function () {
    6.                  window.setInterval(function () {
    7.                      $.ajax({
    8.                          url:'@Url.Action("GetCurrentTime")?'+ new Date().toTimeString() ,
    9.                          success: function (result) {
    10.                             $("ul").append("
    11. " + result + "
    12. ");
    13.                         }
    14.                     });
    15.                 }, 5000);
    16.             });
    17.         
    18.     

    三、通过jQuery的Ajax设置解决问题

    实际上jQuery具有针对这个的Ajax设置,我们只需要按照如下的方式调用$.ajaxSetup方法禁止掉Ajaz的缓存机制。

     
     
     
     
    1.             
    2.         
    3.             $(function () {
    4.                 $.ajaxSetup({ cache: false }); 
    5.                 window.setInterval(function () {
    6.                     $.ajax({
    7.                         url:'@Url.Action("GetCurrentTime")',
    8.                        success: function (result) {
    9.                            $("ul").append("
    10. " + result + "
    11. ");
    12.                        }
    13.                    });
    14.                }, 5000);
    15.            });
    16.        
    17.    
    18. /html>

    实际上jQuery的这个机制也是通过为请求地址添加不同的查询字符串后缀来实现的,这可以通过Fiddler拦截的请求来证实。

    四、通过定制响应解决问题

    我们可以通过请求的响应来控制浏览器针对结果的缓存,为此我们定义了如下一个名为NoCacheAttribute的ActionFilter。在实现的OnActionExecuted方法中,我们调用当前HttpResponse的SetCacheability方法将缓存选项设置为NoCache。该NoCacheAttribute特性被应用到GetCurrentTime方法后,运行我们的程序在IE中依然可以得到实时的时间。

     
     
     
     
    1.  public class HomeController : Controller  
    2.  {  
    3.      public ActionResult Index()  
    4.      {  
    5.          return View();  
    6.      }  
    7.     
    8.      [NoCache]   
    9.      public string GetCurrentTime()  
    10.     {  
    11.         return DateTime.Now.ToLongTimeString();  
    12.     }  
    13. }  
    14. public class NoCacheAttribute : FilterAttribute, IActionFilter  
    15. {  
    16.     public void OnActionExecuted(ActionExecutedContext filterContext)  
    17.     {  
    18.         filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);  
    19.     }  
    20.    
    21.     public void OnActionExecuting(ActionExecutingContext filterContext)  
    22.     {}  

    实际NoCacheAttribute特性最终控制消息消息的Cache-Control报头,并将其设置为“no-cache”,指示浏览器不要对结果进行缓存。如下所示的是针对GetCurrentTime请求的响应消息:

     
     
     
     
    1.  HTTP/1.1 200 OK
    2.  Server: ASP.NET Development Server/10.0.0.0
    3.  Date: Thu, 03 Jan 2013 12:54:56 GMT
    4.  X-AspNet-Version: 4.0.30319
    5.  X-AspNetMvc-Version: 4.0
    6.  Cache-Control: no-cache 
    7.  Pragma: no-cache
    8.  Expires: -1
    9.  Content-Type: text/html; charset=utf-8
    10. Content-Length: 10
    11. Connection: Close
    12. 8:54:56 PM

    当前文章:谈谈IE针对Ajax请求结果的缓存
    当前URL:http://www.mswzjz.cn/qtweb/news41/395691.html

    攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能