栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > asp

如何解决Ajax请求结果的缓存问题说明

asp 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何解决Ajax请求结果的缓存问题说明

在默认情况下,IE会针对请求地址缓存Ajax请求的结果。换句话说,在缓存过期之前,针对相同地址发起的多个Ajax请求,只有第一次会真正发送到服务端。在某些情况下,这种默认的缓存机制并不是我们希望的(比如获取实时数据),这篇文章就来简单地讨论这个问题,以及介绍几种解决方案。
目录
一、问题重现
二、通过为URL地址添加后缀的方式解决问题
三、通过JQuery的Ajax设置解决问题
四、通过定制响应解决问题
一、问题重现
我们通过一个ASP.NET MVC应用来重现IE针对Ajax请求结果的缓存。在一个空ASP.NET MVC应用中我们定义了如下一个默认的HomeController,其中包含一个返回当前时间的Action方法GetCurrentTime。
复制代码 代码如下:
 public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
        public string GetCurrentTime()
        {
           return DateTime.Now.ToLongTimeString();
       }
   }

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


          
      

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

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

    三、通过jQuery的Ajax设置解决问题
    实际上jQuery具有针对这个的Ajax设置,我们只需要按照如下的方式调用$.ajaxSetup方法禁止掉Ajaz的缓存机制。
    复制代码 代码如下:
     
       
                   
               
          
      

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

    四、通过定制响应解决问题
    我们可以通过请求的响应来控制浏览器针对结果的缓存,为此我们定义了如下一个名为NoCacheAttribute的ActionFilter。在实现的OnActionExecuted方法中,我们调用当前HttpResponse的SetCacheability方法将缓存选项设置为NoCache。该NoCacheAttribute特性被应用到GetCurrentTime方法后,运行我们的程序在IE中依然可以得到实时的时间。
    复制代码 代码如下:
     public class HomeController : Controller
        {
            public ActionResult Index()
            {
                return View();
            }

            [NoCache]

            public string GetCurrentTime()
           {
               return DateTime.Now.ToLongTimeString();
           }
       }
       public class NoCacheAttribute : FilterAttribute, IActionFilter
       {
           public void onActionExecuted(ActionExecutedContext filterContext)
           {
             filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
           }

           public void onActionExecuting(ActionExecutingContext filterContext)
           {}
       }
     

    实际NoCacheAttribute特性最终控制消息消息的Cache-Control报头,并将其设置为“no-cache”,指示浏览器不要对结果进行缓存。如下所示的是针对GetCurrentTime请求的响应消息:
    复制代码 代码如下:
     HTTP/1.1 200 OK
        Server: ASP.NET Development Server/10.0.0.0
        Date: Thu, 03 Jan 2013 12:54:56 GMT
        X-AspNet-Version: 4.0.30319
        X-AspNetMvc-Version: 4.0
        Cache-Control: no-cache

        Pragma: no-cache
        Expires: -1
        Content-Type: text/html; charset=utf-8
       Content-Length: 10
       Connection: Close

       8:54:56 PM

    静守己心,看淡浮华

    转载请注明:文章转载自 www.mshxw.com
    本文地址:https://www.mshxw.com/it/57966.html
    我们一直用心在做
    关于我们 文章归档 网站地图 联系我们

    版权所有 (c)2021-2022 MSHXW.COM

    ICP备案号:晋ICP备2021003244-6号