我正在使用jQuery ajax从ASP.Net MVC应用程序检索json,并且当进行ajax调用时,如果设置
我正在使用jQuery 1.9.1和Chrome Version 26.0.1410.64 m。
在使用新的浏览器实例并获取已缓存内容的初始请求时,即使在ajax配置中设置了ifModified=true,也不会向服务器发出检查缓存状态的调用。在来自同一浏览器实例的后续请求中,服务器将如预期地响应304。
在初始请求中,浏览器网络跟踪显示从缓存中传递了内容,状态为200,即使未检查修改日期。Fiddler未显示任何请求,而ASP.Net MVC控制器中的断点未被触发。
这是一个简化的ajax调用示例:
这是一个简化的ASP.Net MVC控制器方法:
ifModified=true
,则无法看到预期的结果。我正在使用jQuery 1.9.1和Chrome Version 26.0.1410.64 m。
在使用新的浏览器实例并获取已缓存内容的初始请求时,即使在ajax配置中设置了ifModified=true,也不会向服务器发出检查缓存状态的调用。在来自同一浏览器实例的后续请求中,服务器将如预期地响应304。
在初始请求中,浏览器网络跟踪显示从缓存中传递了内容,状态为200,即使未检查修改日期。Fiddler未显示任何请求,而ASP.Net MVC控制器中的断点未被触发。
这是一个简化的ajax调用示例:
var req = $.ajax({
type: "GET",
dataType: "json",
url: "/JsonTest/GetJson",
ifModified: true,
success: function (data, status, jqXHR) {
if (data === undefined && status == "notmodified") {
$.ajax({
type: this.type,
dataType: this.dataType,
url: this.url,
ifModified: false,
success: this.success,
error: this.error,
complete: this.complete
});
} else {
alert($.toJSON(data));
}
},
error: function (jqXHR, status, error) {
alert(error);
},
complete: function (jqXHR, status) {
}
});
这是一个简化的ASP.Net MVC控制器方法:
[AllowAnonymous]
public ActionResult GetJson()
{
// dummy data version.
var currentVersion = new DateTime(2013, 04, 30, 12, 0, 0);
// get client cached version from request
DateTime cachedVersion;
if (DateTime.TryParseExact(HttpContext.Request.Headers["If-Modified-Since"], "r", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out cachedVersion))
{
cachedVersion = cachedVersion.ToLocalTime();
}
else
{
cachedVersion = DateTime.MinValue;
}
// return 304 if not changed
if (currentVersion.Subtract(cachedVersion).Duration() < TimeSpan.FromSeconds(1))
{
HttpContext.Response.StatusCode = 304;
HttpContext.Response.StatusDescription = "Not Modified";
return new EmptyResult();
}
// still here? return current object and set current version response header
var rv = new { name = "Hello", value = "World" };
HttpContext.Response.Cache.SetCacheability(HttpCacheability.Private);
HttpContext.Response.Cache.SetLastModified(currentVersion);
return Json(rv, JsonRequestBehavior.AllowGet);
}
重现步骤: 1)启动新的浏览器实例 2)启动ajax请求 3)关闭响应警报窗口 4)启动ajax请求 5)关闭浏览器 重复
第一次,清空缓存: 步骤2向服务器发出请求。服务器会以200响应。 步骤4向服务器发出请求,服务器会以304响应。
第二次 - 缓存中有响应: 步骤2不需要向服务器发出请求。响应从缓存中获取,状态为200。 步骤4向服务器发出请求,服务器会以304响应。
我期望第二次的步骤2会向服务器发出请求并接收到304。
每次使用缓存源时未检查其状态,这是一个大问题,因为缓存数据可能已过时,但用户在同一浏览器实例中发出后续请求之前无法知道它。
If-Modified-Since
дёҖиө·дҪҝз”ЁгҖӮиҜ·еҸӮи§ҒеҰӮдҪ•жЈҖжҹҘjQuery.ajax()иҜ·жұӮеӨҙзҠ¶жҖҒжҳҜеҗҰдёәвҖң304 Not ModifiedвҖқ?гҖӮ - apsillers