ASP.NET MVC实战:jQuery调用Ajax缓存

简介:

尽管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请求的缓存技术了吧,我就不做总结了。










本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/781953,如需转载请自行联系原作者
目录
相关文章
|
设计模式 前端开发 JavaScript
Ajax技术【Ajax 实战】(二)-全面详解(学习总结---从入门到深化)
Ajax技术【Ajax 实战】(二)-全面详解(学习总结---从入门到深化)
201 0
|
开发框架 JSON JavaScript
ASP.NET Core3.1实战教程---基于Jquery单文件上传
ASP.NET Core3.1实战教程---基于Jquery单文件上传
171 0
|
JSON 前端开发 Java
利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
613 0
|
开发框架 前端开发 JavaScript
ASP.NET AJAX使用方法概述(三)
ASP.NET AJAX使用方法概述(三)
199 1
|
前端开发
React技术栈-react使用的Ajax请求库实战案例
这篇文章介绍了在React应用中使用Axios和Fetch库进行Ajax请求的实战案例,展示了如何通过这些库发送GET和POST请求,并处理响应和错误。
191 10
React技术栈-react使用的Ajax请求库实战案例
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
340 1
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
【7月更文挑战第13天】在Web开发中,AJAX和Fetch API是实现页面无刷新数据交换的关键。在Flask博客系统中,通过创建获取评论的GET路由,我们可以展示使用AJAX和Fetch API的前端实现。AJAX通过XMLHttpRequest发送请求,处理响应并在成功时更新DOM。Fetch API则使用Promise简化异步操作,代码更现代。这两个工具都能实现不刷新页面查看评论,Fetch API的语法更简洁,错误处理更直观。掌握这些技巧能提升Python Web项目的用户体验和开发效率。
222 7
|
前端开发 Python
Django框架中Ajax GET与POST请求的实战应用
Django框架中Ajax GET与POST请求的实战应用
|
XML 开发框架 .NET
C# .NET面试系列八:ADO.NET、XML、HTTP、AJAX、WebService
## 第二部分:ADO.NET、XML、HTTP、AJAX、WebService #### 1. .NET 和 C# 有什么区别? .NET(通用语言运行时): ```c# 定义:.NET 是一个软件开发框架,提供了一个通用的运行时环境,用于在不同的编程语言中执行代码。 作用:它为多语言支持提供了一个统一的平台,允许不同的语言共享类库和其他资源。.NET 包括 Common Language Runtime (CLR)、基础类库(BCL)和其他工具。 ``` C#(C Sharp): ```c# 定义: C# 是一种由微软设计的面向对象的编程语言,专门为.NET 平台开发而创建。 作
660 2
|
开发框架 缓存 前端开发
安装ASP.NET AJAX (一安装)
安装ASP.NET AJAX (一安装)
301 0