$ .getJSON返回IE8中的缓存数据


102

目前,我正在使用ASP.net MVC和JQuery。我遇到了似乎没有任何意义的行为。

我正在调用JQuery的$.getJSON函数来填充一些div。事件在事件上触发$(document).ready。这很完美。

有一个小的AJAX.BeginForm值会在填充div时添加另一个要使用的值。它正确地调用了远程函数,并且成功调用了原始的javascript函数以重新填充div。

这是奇怪的部分:在FireFox和Chrome中-一切正常。但是在IE8(测试版)中,对填充Div脚本的第二次调用(调用$ .getJSON函数)获取缓存的数据,并且不询问服务器!

希望这个问题有意义:简而言之-为什么要$.getJSON获取缓存的数据?为什么只影响IE8?


奇怪的是,我不仅在IE中看到了此错误,在Firefox中也看到了。在jquery中禁用ajax缓存对我有所帮助。
约瑟夫·萨布(JosefSábl)2010年

Answers:


67

只是让您知道,Firefox和Chrome认为所有Ajax请求都是不可缓存的。IE(所有版本)与其他Web请求一样对待Ajax调用。这就是为什么您看到此行为。
如何在每次请求时强制IE下载数据:

  • 如您所说,在JQuery中使用'cache'或'nocache'选项
  • 向请求中添加一个随机参数(难看,但是可行:))
  • 在服务器端,设置可缓存性(例如,使用属性,请参见下文)

码:

public class NoCacheAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    }
}

1
这种解决方案吸引了我。我真的很喜欢在MVC中应用服饰的优雅
Andrew Harry

1
现在有一个OutputCacheAttribute OOTB。
bzlm

1
@bzlm,但这更易于搜索
Simon_Weaver

请查看formatinternet.wordpress.com/2010/01/14/…以获得客户端解决方案
Ivo

1
实际上,这是另一回事,但是我同意作为开发人员IE需要耐心:)
Nico 2012年

107

这就是它为我工作的方式...

$.ajaxSetup({ cache: false });
$.getJSON("/MyQueryUrl",function(data,item) {
     // do stuff with callback data
     $.ajaxSetup({ cache: true });
   });

我正在为这个问题而苦苦挣扎,您的解决方案为解决该问题提供了一种快速的方法。:)我有一个问题,您知道$ .ajaxSetup可以使用哪些选项吗?不幸的是,jQuery文档没有提供详细信息...
Achimnol

1
可用选项与$ .ajax相同。有关更多信息,请参阅docs.jquery.com/Ajax/jQuery.ajax#options
Dan Esparza,2009年

12
上面的代码有一点警告-它包含竞争条件。由于调用及其响应是异步的,因此应$.ajaxSetup({ cache: true });getJSON()而不是在回调之后立即 调用。
2012年

16

感谢肯特的回答。使用$ .ajax('{cache:no}'); 工作完美。[编辑]

或者至少我以为我做到了。似乎jquery $ .getJSON没有读取对$ .ajax对象所做的任何更改。

最终起作用的解决方案是手动添加新参数

var noCache = Date();
$.getJSON("/somepage/someaction", { "noCache": noCache }, Callback);

日期解析仅是分钟;这实际上意味着该解决方案仍然可以缓存一分钟。就我的目的而言,这是可以接受的。


9
var noCache = new Date()。getTime(); //将为您介绍女士
scunliffe

感谢Scunliffe!-我对javascript很陌生,ASP MVC为我打开了新视野
Andrew Harry

您也可以尝试使用Math.Random()之类的方法。
Falkayn

@Falkayn- Math.Random()可以使用hard ,其结果将是未知的,并且您可能连续两次(或多次)获得相同的数字。使用new Date().getTime()将确保它永远不会重复。(除非您能够返回时间;))
Dementic 2013年

11

我通过将以下属性放在Controller中的Action上解决了相同的问题:

[OutputCache(Duration = 0, VaryByParam = "None")]

精彩!很高兴有其他选择(我选择了这一选择)。感谢所有贡献者!
Anders Juul 2010年

与Asp.Net MVC 4.0配合使用
Mayank

4

如果您使用的是ASP.net MVC,请考虑添加扩展方法以轻松实现无缓存,如下所示:

    public static void NoCache(this HttpResponse Response)
    {
        Response.Cache.SetNoStore();
        Response.Cache.SetExpires(DateTime.MinValue);
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetValidUntilExpires(false);

        Response.Expires = -1;
        Response.ExpiresAbsolute = DateTime.MinValue;
        Response.AddHeader("Cache-Control", "no-cache");
        Response.AddHeader("Pragma", "no-cache");
    }

好主意-因此您在回调期间在服务器上调用此扩展方法对吗?
Guy

2

您可能需要发送一个缓存破坏者。

我建议使用$ .ajax({cache:no})以防万一(将随机后缀添加到get请求中)

(这些天我倾向于在各处使用$ .ajax,更可调整)


感谢您的回答!...我还没有尝试过。将提供反馈不久
安德鲁·哈利

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.