• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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请求的缓存技术了吧,我就不做总结了。

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

    以上这篇ASP.NET MVC中使用jQuery时的浏览器缓存问题详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • ASP.NET Core缓存静态资源示例详解
    • 详解ASP.NET Core 中间件之压缩、缓存
    • Asp.Net中MVC缓存详解
    • asp.net性能优化之使用Redis缓存(入门)
    • ASP.NET下使用xml反序列化、缓存依赖实现个性化配置文件的实时生效
    • ASP.NET页面缓存常见的4种方式
    • 详解Asp.Net Core 2.1+的视图缓存(响应缓存)
    上一篇:asp.net(C#)实现功能强大的时间日期处理类完整实例
    下一篇:ASP.NET中URL Routing和IIS上URL Rewriting的区别
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    ASP.NET MVC中使用jQuery时的浏览器缓存问题详解 ASP.NET,MVC,中,使用,jQuery,