如何修复浏览器缓存和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
问题描述
如何解决浏览器的缓存和 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屋!