当前位置: 移动技术网 > IT编程>开发语言>.net > ASP.NET MVC中使用jQuery时的浏览器缓存问题详解

ASP.NET MVC中使用jQuery时的浏览器缓存问题详解

2017年12月12日  | 移动技术网IT编程  | 我要评论

用姓名查身份证,赵磊全套漏鸟图,jancenay

介绍

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

英文原文来自:

以上这篇asp.net mvc中使用jquery时的浏览器缓存问题详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网