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时的浏览器缓存问题详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索jquery
, asp.net
, 缓存
mvc
,以便于您获取更多的相关知识。

时间: 2024-10-03 10:08:16

ASP.NET MVC中使用jQuery时的浏览器缓存问题详解_实用技巧的相关文章

ASP.NET MVC中使用Bundle打包压缩js和css的方法_实用技巧

在ASP.NET MVC4中(在WebForm中应该也有),有一个叫做Bundle的东西,它用来将js和css进行压缩(多个文件可以打包成一个文件),并且可以区分调试和非调试,在调试时不进行压缩,以原始方式显示出来,以方便查找问题. 具体优势可自行百度或参看官方介绍:http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification 这里仅简单记录下如何使用. 首先,如果是使用的ASP.NET MVC4基本或者其他内容更丰富的模板,B

ASP.NET MVC 中实现基于角色的权限控制的处理方法_实用技巧

[Authorize]public ActionResult Index() 标记的方式,可以实现所标记的ACTION必须是认证用户才能访问: 通过使用 [Authorize(Users="username")] 的方式,可以实现所标记的ACTION必须是某个具体的用户才能访问,以上两种方式使用起来非常方便,在NeedDinner示例程序中已有具休的实现过程, 但是,我们在实际的应用中所使用的大都是基于角色(Roles)的认证方式,NeedDinner中却未给出,本文给出具体实现(基于

ASP.NET中获取URL重写前的原始地址详解_实用技巧

通常的使用场景是当我们有某个页面需要用户登录才能访问时,我们会在代码中判断当前访问用户是否登录,如果未登录,则重定向至登录页面,并将当前网址通过Url参数传递给登录页面.如果使用了URL重写,并通过Request.Url.AbsoluteUri获取当前网址,用户登录后打开的就是重写后的地址,这虽然不影响正常使用,但从用户体验及URL统一的角度,我们更希望是重写前的地址. 之前,我们在开发中也被这个问题困扰,只能尽量通过js重定向至登录页面(通过location.href获取当前网址)或者在代码中

ASP.NET组件System.Web.Optimization原理及缓存问题详解_实用技巧

1]开篇介绍 这篇文章将简单的分析一下有关静态文件捆绑的ASP.NET组件System.Web.Optimization的运行原理及基本的缓存问题: 在我们的项目里面充斥着很多静态文件,为了追求模块化.插件化很多静态文件都被设计成模块的方式或者被分解,在需要的时候在通过组合的方式在UI层上使用:这就带来一个问题,文件多了会影响浏览器加载页面的速度,而且由于浏览器的并发限制,对于并行的请求不是无限制的,所以捆绑静态文件的功能就产生:其实在以前,IIS还没有集成管道模型的时候我们只能通过动态资源的方

ASP.NET MVC数组模型绑定详解_实用技巧

在ASP.NET MVC中使用Razor语法可以在视图中方便地展示数组,如果要进行数组模型绑定,会遇到索引断裂问题,如下示例: <input type="text" name="[0].Name" /> <input type="text" name="[1].Name" /> <input type="text" name="[2].Name" />

利用ASP.NET MVC和Bootstrap快速搭建响应式个人博客站(一)_实用技巧

1.0 为什么要做这个博客站? 因此,我下决心开发一个个人技术博客站.主要原因是:可以整合各种宝贵资源,将知识变为宝库:可以借此巩固加强一下自己的"全栈"基础:记录工作生活中遇到的问题及其解决方案:可以帮助遇到同样问题的网友. 2.0 简单介绍下此个人博客用到的技术点 可以先点击进去看看.地址是http://www.zynblog.com该博客站基于ASP.NET MVC + EF6.0,采用Bootstrap响应式布局搭建,因此使用IE8以下的浏览器访问时可能会出现错位等一系列问题.

ASP.NET MVC异常处理模块详解_实用技巧

一.前言 异常处理是每个系统必不可少的一个重要部分,它可以让我们的程序在发生错误时友好地提示.记录错误信息,更重要的是不破坏正常的数据和影响系统运行.异常处理应该是一个横切点,所谓横切点就是各个部分都会使用到它,无论是分层中的哪一个层,还是具体的哪个业务逻辑模块,所关注的都是一样的.所以,横切关注点我们会统一在一个地方进行处理.无论是MVC还是WebForm都提供了这样实现,让我们可以集中处理异常. 在MVC中,在FilterConfig中,已经默认帮我们注册了一个HandleErrorAttr

Asp.net mvc 权限过滤和单点登录(禁止重复登录)_实用技巧

1.权限控制使用controller和 action来实现,权限方式有很多种,最近开发项目使用控制控制器方式实现代码如下 /// <summary> /// 用户权限控制 /// </summary> public class UserAuthorize : AuthorizeAttribute { /// <summary> /// 授权失败时呈现的视图 /// </summary> public string AuthorizationFailView

ASP.NET MVC阿里大于短信接口开发短信群发能_实用技巧

        互联网上有许多公司提供短信接口服务,诸如网易云信.阿里大于等等.我在自己项目里需要使用到短信服务起到通知作用,实际开发周期三天,完成配置.开发和使用,总的说,阿里大于提供的接口易于开发,非常的方便,短信费用是计数缴纳的,作为个人开发者,我使用的服务业务产生的费用为0.045¥/条(10万条以下). 现在要实现一个例会短信群发通知的功能,所有被通知对象信息均存于Mysql中,应用架构采用asp.net MVC .首先准备好获取的API各项(以下各项服务参数都需要在大于官网上申请),