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,如需转载请自行联系原作者
目录
相关文章
|
数据采集 自然语言处理 Java
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
本文以反面教材形式,剖析了在使用 Playwright 爬取懂车帝车友圈问答数据时常见的配置错误(如未设置代理、Cookie 和 User-Agent),并提供了 Python、Java 和 .NET 三种语言的修复代码示例。通过错误示例 → 问题剖析 → 修复过程 → 总结教训的完整流程,帮助读者掌握如何正确配置爬虫代理及其它必要参数,避免 IP 封禁和反爬检测,实现高效数据采集与分析。
735 3
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
|
开发框架 搜索推荐 算法
一个包含了 50+ C#/.NET编程技巧实战练习教程
一个包含了 50+ C#/.NET编程技巧实战练习教程
545 18
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
323 1
|
测试技术 API 开发者
.NET单元测试框架大比拼:MSTest、xUnit与NUnit的实战较量与选择指南
【8月更文挑战第28天】单元测试是软件开发中不可或缺的一环,它能够确保代码的质量和稳定性。在.NET生态系统中,MSTest、xUnit和NUnit是最为流行的单元测试框架。本文将对这三种测试框架进行全面解析,并通过示例代码展示它们的基本用法和特点。
2082 8
|
SQL 关系型数据库 数据库
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
427 2
|
消息中间件 开发框架 .NET
.NET 8 强大功能 IHostedService 与 BackgroundService 实战
【11月更文挑战第7天】本文介绍了 ASP.NET Core 中的 `IHostedService` 和 `BackgroundService` 接口及其用途。`IHostedService` 定义了 `StartAsync` 和 `StopAsync` 方法,用于在应用启动和停止时执行异步操作,适用于资源初始化和清理等任务。`BackgroundService` 是 `IHostedService` 的抽象实现,简化了后台任务的编写,通过 `ExecuteAsync` 方法实现长时间运行的任务逻辑。文章还提供了创建和注册这两个服务的实战步骤,帮助开发者在实际项目中应用这些功能。
835 0
|
开发框架 缓存 前端开发
实战.NET Framework 迁移到 .NET 5/6
从.NET Framework 迁移到.NET 5/6 是一次重要的技术革新,涵盖开发环境与应用架构的全面升级。本文通过具体案例详细解析迁移流程,包括评估现有应用、利用.NET Portability Analyzer 工具识别可移植代码、创建新项目、逐步迁移代码及处理依赖项更新等关键步骤。特别关注命名空间调整、JSON 序列化工具更换及数据库访问层重构等内容,旨在帮助开发者掌握最佳实践,确保迁移过程平稳高效,同时提升应用性能与可维护性。
553 2
|
API 开发者 Java
API 版本控制不再难!Spring 框架带你玩转多样化的版本管理策略,轻松应对升级挑战!
【8月更文挑战第31天】在开发RESTful服务时,为解决向后兼容性问题,常需进行API版本控制。本文以Spring框架为例,探讨四种版本控制策略:URL版本控制、请求头版本控制、查询参数版本控制及媒体类型版本控制,并提供示例代码。此外,还介绍了通过自定义注解与过滤器实现更灵活的版本控制方案,帮助开发者根据项目需求选择最适合的方法,确保API演化的管理和客户端使用的稳定与兼容。
908 0
|
开发框架 监控 .NET
开发者的革新利器:ASP.NET Core实战指南,构建未来Web应用的高效之道
【8月更文挑战第28天】本文探讨了如何利用ASP.NET Core构建高效、可扩展的Web应用。ASP.NET Core是一个开源、跨平台的框架,具有依赖注入、配置管理等特性。文章详细介绍了项目结构规划、依赖注入配置、中间件使用及性能优化方法,并讨论了安全性、可扩展性以及容器化的重要性。通过这些技术要点,开发者能够快速构建出符合现代Web应用需求的应用程序。
323 0
|
监控 Cloud Native 开发者
云端精英的.NET微服务秘籍:Azure上的创新实战演练
【8月更文挑战第28天】在现代软件开发中,微服务架构通过分解应用程序提升可维护性和扩展性。结合Azure与.NET框架,开发者能轻松打造高效且易管理的云原生微服务。首先,使用Docker容器化.NET应用,并借助Azure Kubernetes Service(AKS)或Azure Container Instances(ACI)部署。为确保高可用性和伸缩性,可利用Azure Traffic Manager负载均衡及Azure Autoscale动态调整实例数。
178 0