如何修复浏览器缓存和notmodified响应的JSON? jQuery.ajax({ifModified:真,缓存:真})上的数据响应JSON请求突破 [英] How to fix browser cache and notmodified respond for JSON? jQuery.ajax({ifModified:true,cache:true}) JSON request break on data respond

查看:1040
本文介绍了如何修复浏览器缓存和notmodified响应的JSON? jQuery.ajax({ifModified:真,缓存:真})上的数据响应JSON请求突破的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何解决浏览器的缓存和 notmodified 回应的JSON? jQuery.ajax({ifModified:真,缓存:真}) JSON请求对数据中断响应

第一次浏览器请求的http://本地主机/ API 返回状态 200 OK 和的nextS 304未修改

  $。阿贾克斯({
    键入:GET,
    网址:HTTP://本地主机/ API',// {内容=你好!}
    数据类型:JSON,
    缓存:真正的,
    ifModified:真正的,//让我们响应`304:notmodified`
    成功:功能(数据,textStatus,jqXHR){
        console.debug(jqXHR.status +:+ textStatus);
        console.debug(数据); //为什么一再请求返回`undefined`?
    }
});
 

XHR第一次返回OK:

  200:成功
对象{CONTENT =你好!}
 

但在接下来的时间返回数据 未定义

  304:notmodified
未定义
 

如何解决呢?似乎jQuery的1.5.1的错误。 预期的结果:

  304:notmodified
对象{CONTENT =你好!}
 

解决方案

当您收到一个304,你必须重新请求数据,但与ifModified标志设置为false。那么该请求将受到正常的缓存规则,你将收到您的缓存数据。

有关实例,在MVC的控制器...

 日期时间pageLastUpdated =< ......>

        如果(Request.Headers [如果 - 修改 - 自]!= NULL)
        {
            VAR DT = DateTime.Parse(Request.Headers [如果 - 修改 - 自]作为字符串);

            如果(pageLastUpdated.Date == dt.Date和放大器;&安培; pageLastUpdated.Hour == dt.Hour和放大器;&安培; pageLastUpdated.Minute == dt.Minute和放大器;&安培; pageLastUpdated.Second == dt.Second){
              Response.Cache.SetCacheability(HttpCacheability.NoCache);
              返回新的HTTPStatus codeResult(304,notmodified);
            }
        }

        Response.Cache.SetCacheability(HttpCacheability.Private);
        Response.Cache.SetVaryByCustom(*);
        Response.Cache.SetExpires(pageLastUpdated.AddDays(1));
        Response.Cache.SetLastModified(pageLastUpdated);

        现在//返回的Json
        返回JSON(新{........});
 

发回的数据被缓存在客户端上长达1天

 函数loadJson(URL,参数,可以onLoaded){
  //初始请求
  $阿贾克斯({
    键入:GET,
    数据类型:JSON,
    网址:网址,
    数据:参数,可以
    缓存:真正的,
    ifModified:真正的,//部队检查与服务器
    成功:函数(结果,textStatus,jqXHR){

        如果// 304,重新请求的数据
        如果(结果===不确定和放大器;&安培; textStatus =='notmodified'){
            $阿贾克斯({
                键入:GET,
                数据类型:JSON,
                网址:网址,
                数据:参数,可以
                缓存:真正的,
                ifModified:假的,//不与服务器检查
                成功:函数(cachedResult,textStatus,jqXHR){
                    onLoaded(cachedResult);
                }
            });
        }
        其他
            onLoaded(结果);
    }
});
 

How to fix browser cache and notmodified respond for JSON? jQuery.ajax({ifModified:true,cache:true}) JSON request break on data respond.

First time browser request http://localhost/api returns status 200 OK and nexts 304 Not Modified

$.ajax({
    type:"GET",
    url:'http://localhost/api', // {"content"="Hello!"}
    dataType:'json',
    cache:true,
    ifModified:true,            // Lets respond `304:notmodified`
    success:function(data,textStatus,jqXHR){
        console.debug(jqXHR.status+':'+textStatus);
        console.debug(data);    // Why on repeated request returns `undefined`?
    }
});

XHR first time returns ok:

200:success
Object {content="Hello!"}

but on next times returns data undefined:

304:notmodified
undefined

How to solve it? It seems jQuery 1.5.1 bug. Expected result:

304:notmodified
Object {content="Hello!"}

解决方案

When you receive a 304 you must re-request the data but with the "ifModified" flag set to false. The request will then be subject to normal caching rules and you will receive your cached data.

For instance, in an MVC controller...

        DateTime pageLastUpdated = <.....>

        if (Request.Headers["If-Modified-Since"] != null)
        {
            var dt = DateTime.Parse(Request.Headers["If-Modified-Since"] as string);

            if (pageLastUpdated.Date == dt.Date && pageLastUpdated.Hour == dt.Hour && pageLastUpdated.Minute == dt.Minute && pageLastUpdated.Second == dt.Second) {
              Response.Cache.SetCacheability(HttpCacheability.NoCache);                    
              return new HttpStatusCodeResult(304, "notmodified");
            }
        }

        Response.Cache.SetCacheability(HttpCacheability.Private);
        Response.Cache.SetVaryByCustom("*");
        Response.Cache.SetExpires(pageLastUpdated.AddDays(1));
        Response.Cache.SetLastModified(pageLastUpdated);

        // now return the Json
        return Json(new {........});

The data sent back is cached on the client for up to 1 day.

function loadJson(url, params, onLoaded) {
  // initial request 
  $.ajax({
    type: 'GET',
    dataType: 'json',
    url: url,
    data: params,
    cache: true,
    ifModified: true, // forces check with server
    success: function (result, textStatus, jqXHR) {

        // if 304, re-request the data
        if (result === undefined && textStatus == 'notmodified') {
            $.ajax({
                type: 'GET',
                dataType: 'json',
                url: url,
                data: params,
                cache: true,
                ifModified: false, // don't check with server
                success: function (cachedResult, textStatus, jqXHR) {
                    onLoaded(cachedResult);
                }
            });
        }
        else
            onLoaded(result);
    }
});

这篇关于如何修复浏览器缓存和notmodified响应的JSON? jQuery.ajax({ifModified:真,缓存:真})上的数据响应JSON请求突破的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆