ASP.NET中jquery的ajax浏览器缓存问题讲解

先我们来看看jquery的ajax缓存问题

jquery的ajax请求默认请求cache是true 也就是开启的,dataType为script和jsonp时默认为false。现在我要在浏览器里读取缓存,因为ajax请求的数据很大,请求一次就够了。但是问题来了,在FF里面,是没有ajax缓存的,也就是每次都会触发ajax请求,这点和IE不一样。所以在这里就得注意,做个判断,阻止触发ajax事件。

function ajax_show(apartId,roomClass,sortTile){
      HX_THIS_FANGXING_NUM=sortTile;
      huxing_pic_set_color();    
      var this_li=$('#title_'+sortTile);
      var cache=this_li.data("cache");
      if(undefined!=cache){
       var data_arr =cache.split('-');
        xg_pic_links=data_arr[0];//缓存记录
        layout_pic_links=data_arr[1];
        layout_big_pic_links=data_arr[2];
        product_links=data_arr[3];
           xg_pic_deal_array();
        xg_show_pic(xg_now_pic_id);
        }else{
               $.ajax({//用JQ的缓存cache在FF下还是会发起新请求
                type: "POST",
               url: "index.php?m=content&c=index&a=ajax_all_pic",
              data: "apartId=123&roomClass=123",
             dataType:'text',
              success: function(backdata){
                   this_li.data('cache',backdata);//缓存记录     
                   var data_arr =backdata.split('-');
                   xg_pic_links=data_arr[0];    
                   layout_pic_links=data_arr[1];
                   layout_big_pic_links=data_arr[2];
                   product_links=data_arr[3];
                   xg_pic_deal_array();
                   xg_show_pic(xg_now_pic_id);             
           }
       });
       
      } 
}

通过  this_li.data('cache',backdata);//缓存记录  ,来做标记
    
缓存解释

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中的代码只是一个例子(非真实代码),在真实的实现中,服务器端应该能够知道数据自从上次响应以后是否被修改过。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c#
, 服务器
, 数据
, 缓存
, 代码
cache
,以便于您获取更多的相关知识。

时间: 2024-09-25 05:44:35

ASP.NET中jquery的ajax浏览器缓存问题讲解的相关文章

Asp.net中jquery的ajax请求页面获取参数的注意点

 ASP.net中get和post提交方式,利用request参数的方式是不同的.   一.接收用get 方法传输的数据的写法: protected void Page_Load(object sender, EventArgs e)       {           string id = Request.QueryString["name"];           string website = Request.QueryString["website"];

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

介绍 尽管jQuery在浏览器ajax调用的时候对缓存提供了很好的支持,还是有必要了解一下如何高效地使用http协议. 首先要做的事情是在服务器端支持HTTP GET,定义不同的URL输出不同的数据(MVC里对应的就是action).如果要使用同一个地址获取不同的数据,那就不对了,一个HTTP POST也不行因为POST不能被缓存.许多开发人员使用POST主要有2个原因:明确了数据不能被缓存,或者是避免JSON攻击(JSON返回数组的时候可以被入侵). 缓存解释 jQuery全局对象里的ajax

asp.net中mvc使用ajax提交参数的匹配问题解决探讨

本文为大家介绍下使用javaScript解决asp.net中mvc使用ajax提交参数的匹配问题,遇到类似情况的朋友可以参考下,希望对大家有所帮助   想到在asp.net的mvc中如果使用ajax向服务端传递参数时如果参数是一个类或者是个数组(或List集合)以及更复杂的对象时,服务端总是会发 生取不到值的情况,当然网上也有很多解决的例子,但都是在服务端想办法来解决的(比如将json转换为字符串,再在服务端反序列化为一个对象),为何不能 在客户端就把这个问题搞定. 其实问题没那么复杂,那是因为

java web中jquery实现ajax问题

问题描述 java web中jquery实现ajax问题 利用jquery中ajax实现区域的5级联动,当点击第一个下拉框时,可以在第二个下拉框中填充相应数据,但是当点击第二个下拉框时,不能填充第三个下拉框,在Action中可以获取到数据 解决方案 JQuery实现Ajax加载图片 解决方案二: 只做过两个的省市联动,还不是要异步查询数据库的. 解决方案三: 现在现在现在.不懂这个问题 解决方案四: ajax异步查询就可以了 解决方案五: F12看浏览器控制台报什么错误 解决方案六: 具体你还是

asp.net中gridview在360浏览器的网页中显示出空白的边框

问题描述 asp.net中gridview在360浏览器的网页中显示出空白的边框 利用VS中的asp.net编写网页时,用Gridview来绑定数据,在本地运行正常,用IIS发布后,不显示数据时(不查询,只有表头ID)在IE浏览器中也是正常的:但是在360浏览器中就显示出问题了:表头(第一行)后面接着显示出空白的边框(第二行).我怀疑是浏览器兼容性的问题,请问这个怎么修改???

asp.net中在用ajax格式传递数据到aspx页面时出现乱码_实用技巧

 asp.net中在用ajax格式传递数据到aspx页面时有时会出现乱码,以下为解决方法 js中 : 复制代码 代码如下: XmlHttp.open("POST", "test.aspx", false); XmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); XmlHttp.send("QueryName=&qu

ASP.NET与JQUERY的AJAX文件上传 视频课件+源码Demo

 以前的一个上传文字教程,有很多朋友反映只能在本地上传文件,传到服务器端后,上传不了,这次的Demo完全解决了上次的问题. ASP.NET与JQUERY的AJAX文件上传 视频课件+源码Demo 下面视频 如果你看不太清楚,请点击播放器的全屏按钮进行观看!     视频课件+源码Demo下载地址: ASP.NET与JQUERY的AJAX文件上传.rar

asp.net中jquery $.ajax实现数据调用实现

最近在ASP.NET中做了一个AJAX调用 : Client端先从ASP.NET Server后台取到一个页面模板,然后在页面初始化时再从Server中取一些相关数据以实现页面模板的动态显示.具体实现为: 1)      Client向 ASP.NET后台发送HTTP GET 请示 2)      后台给Client发送一个HTML模板,同时在内存中存储一个XML  String  (包含页面模板动态显示所需的数据) 3)      Client在初始化页面时,发送AJAX请求,拿到XML St

ASP.NET中JQuery+AJAX调用后台_实用技巧

做订餐系统手机端时,遇到一个问题,实现登录功能时,我要调用后台的方法进行验证和判断.我们应用的是webForm进行开发的,正常情况下只要绑定按钮的方法,前后台对应就可以实现.但是,手机端应用MUI样式之后,就不适用于这种情况了.基于这个问题,我们使用JQuery+Ajax技术,其实MUI中也自带ajax技术.  实现过程: webForm代码:       function login() { var name = document.getElementById("username")