介绍

尽管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());
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());
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 % == )
{
return new HttpStatusCodeResult((int)HttpStatusCode.NotModified);
} Response.Cache.SetExpires(DateTime.Now.AddSeconds());
Response.Cache.SetLastModified(DateTime.Now); return Json(new { count = Count++ }, JsonRequestBehavior.AllowGet);
}

上述MVC action中的代码只是一个例子(非真实代码),在真实的实现中,服务器端应该能够知道数据自从上次响应以后是否被修改过。

ASP.NET MVC中使用jQuery时的浏览器缓存问题的更多相关文章

  1. asp.net mvc中使用jquery H5省市县三级地区选择控件

    地区选择是项目开发中常用的操作,本文讲的控件是在手机端使用的选择控件,不仅可以用于实现地区选择,只要是3个级别的选择都可以实现,比如专业选择.行业选择.职位选择等.效果如下图所示: 附:本实例asp. ...

  2. 在ASP.NET MVC中使用jQuery的Load方法加载静态页面的一个注意点

    使用使用jQuery的Load方法可以加载静态页面,本篇就在ASP.NET MVC下实现. Model先行: public class Article { public int Id { get; s ...

  3. 记录:asp.net mvc 中 使用 jquery 实现html5 实现placeholder 密码框 提示兼容password IE6

    @{ViewBag.Title = "完美结合";} <script>var G_start_time = new Date;</script> <! ...

  4. ASP.NET MVC 中使用 jQuery 实现异步搜索功能

    常见的几种异步请求方式: Ajax.BeginForm   异步提交文本的形式 Ajax.ActionLinkk 文本链接的形式 Client Validataion  客户端的认证 一.用jQuer ...

  5. asp.net mvc中包含webapi时,token失效产生302的解决方案

    public void ConfigureAuth(IAppBuilder app) { app.UseCookieAuthentication(new CookieAuthenticationOpt ...

  6. 在asp.net mvc中使用PartialView返回部分HTML段

    问题链接: MVC如何实现异步调用输出HTML页面 该问题是个常见的 case, 故写篇文章用于提示新人. 在asp.net mvc中返回View时使用的是ViewResult,它继承自ViewRes ...

  7. ASP.NET MVC中Area的另一种用法

    ASP.NET MVC中Area的另一种用法 [摘要]本文只是为一行代码而分享 context.MapRoute("API", "api/{controller}/{ac ...

  8. [转]在asp.net mvc中使用PartialView返回部分HTML段

    本文转自:http://blog.csdn.net/sandy945/article/details/6307750 问题链接: MVC如何实现异步调用输出HTML页面 该问题是个常见的 case, ...

  9. ASP.NET MVC 中使用 AjaxFileUpload 插件时,上传图片后不能显示(预览)

    AjaxFileUpload 插件是一个很简洁很好用的上传文件的插件,可以实现异步上传功能,但是在 ASP.NET MVC中使用时,会出现上传图片后不能正确的显示的问题,经过仔细排查,终于找到原因,解 ...

随机推荐

  1. JAVAEE——SSH项目实战03:新增客户、数据字典、文件上传和修改客户

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7145599.html 一.新增客户 1.数据字典  用于枚举项目中有限个数的字典项 (1 ...

  2. @NamedEntityGraphs --JPA按实体类对象参数中的字段排序问题得解决方法

    JPA按实体类对象参数中的字段排序问题得解决方法@Entity @Table(name="complaints") @NamedEntityGraphs({ @NamedEntit ...

  3. BZOJ 1975: [Sdoi2010]魔法猪学院 大水题 第k短路 spfa

    https://www.lydsy.com/JudgeOnline/problem.php?id=1975 我好像到现在了第k短路都不会写,mdzz. 先spfa求出最短路,然后扫点存各种前置路径已经 ...

  4. [Agc001E] BBQ Hard

    [Agc001E] BBQ Hard 题目大意 给定\(n\)对正整数\(a_i,b_i\),求\(\sum_{i=1}^{n-1} \sum_{j=i+1}^n \binom{a_i+b_i+a_j ...

  5. 【拉格朗日插值法】【找规律】【高精度】Gym - 101156G - Non-Attacking Queens

    题意:问你n*n的国际象棋棋盘上放3个互不攻击皇后的方案数. oeis……公式见代码内 //a(n) = 5a(n - 1) - 8a(n - 2) + 14a(n - 4) - 14a(n - 5) ...

  6. bzoj 2850

    比较基础的KD树.每个节点维护一个BOX,包含包含当当前子树的点的最小矩形,以及点权和,然后用“整个矩形都在直线的一侧”和“整个矩形都不在直线的一侧”剪枝. /******************** ...

  7. UVALive 4426 Blast the Enemy! 计算几何求重心

    D - Blast the Enemy! Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Subm ...

  8. DEX 可视化查阅

    参考: http://bbs.pediy.com/thread-208828.htm 010 Editor 下载地址: http://www.sweetscape.com/download/ //-- ...

  9. Bootstrap_CSS概览

    在这一章中,我们将讲解 Bootstrap 底层结构的关键部分,包括我们让 web 开发变得更好.更快.更强壮的最佳实践. HTML 5 文档类型(Doctype) Bootstrap 使用了一些 H ...

  10. addEventListener 的一些好方法 简单粗暴的说给你

    function show(){ document.addEventListener("click",fn,{ "passive":false, "c ...