ERP俱乐部
ERP爱好者、ERP从业者互相交流、互相学习的乐园;我们的愿景是成为全球一流的中文ERP(Enterprise Resource Planning)交流平台
网站首页 论坛首页 搜索 用户列表 FAQ 注册 登录  
ERP俱乐部 -> Microsoft专栏 -> ASP.NET -> jQuery调用Ajax高效缓存:.NET MVC实战
  jQuery调用Ajax高效缓存:.NET MVC实战
帖子发起人: 半神   发起时间: 2012-02-20 04:19 下午   回复数: 0
? 上一主题 下一主题 ?
楼主
  2012-02-20, 04:19 下午
半神 离线,最后访问时间: 2013/6/5 18:59:05 半神

发帖数前25位

超级管理员
职务: 超级管理员
80级
等级: 80级
注册: 2008年1月6日
区域: 华南
经验: 1,267
积分: 1,131
精华: 2
发贴: 590
排名: 26
Site AdministratorsGlobal ModeratorsSite ModeratorsSite Registered Users培训学员(MM学员服务区-北京200708班) 培训学员(FI学员服务区-深圳200805班) 每日发帖之星
jQuery调用Ajax高效缓存:.NET MVC实战
 
尽管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);

  }

 

  客户端从来不缓存数据

  客户端决定每次都要最新的数据(不能使用缓存),也就是说ajax里的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


开源时代的到来,对与技术人员是一个巨大的考验



QQ:876162454


分享按钮 IP 地址: 已登录   来自: 已登录    返回顶部
 第 1 页 总共 1 页 [共有 1 条记录]
ERP俱乐部 -> Microsoft专栏 -> ASP.NET -> jQuery调用Ajax高效缓存:.NET MVC实战
(C)Copyright 2005-2020 www.erpclub.org All Rights Reserved.
Tel:+86-755-26444630
Email:webmaster@yok.com.cn