IE8的意外缓存导致IE8

时间:2009-06-18 16:14:59

标签: asp.net jquery ajax internet-explorer

我遇到了来自JQuery Ajax请求的Internet Explorer缓存结果的严重问题。

我的网页上有标题,每次用户导航到新页面时都会更新。页面加载后我就这样做了

$.get("/game/getpuzzleinfo", null, function(data, status) {
    var content = "<h1>Wikipedia Maze</h1>";
    content += "<p class='endtopic'>Looking for <span><a title='Opens the topic you are looking for in a separate tab or window' href='" + data.EndTopicUrl + "' target='_blank'>" + data.EndTopic + "<a/></span></p>";
    content += "<p class='step'>Step <span>" + data.StepCount + "</span></p>";
    content += "<p class='level'>Level <span>" + data.PuzzleLevel.toString() + "</span></p>";
    content += "<p class='startover'><a href='/game/start/" + data.PuzzleId.toString() + "'>Start Over</a></p>";

    $("#wikiheader").append(content);

}, "json");

它只是将页眉信息注入页面。你可以转到www.wikipediamaze.com然后登录并开始一个新的谜题来查看它。

在我测试的每个浏览器中(谷歌浏览器,Firefox,Safari,Internet Explorer),它在IE中的效果非常好之外。 Eveything在IE 中第一次注入就好了,但之后它甚至从未调用/game/getpuzzleinfo。这就像是缓存了结果或其他东西。

如果我将呼叫更改为$.post("/game/getpuzzleinfo", ... IE就可以了。但随后Firefox退出了工作。

有人可以就此解释IE为何缓存我的$.get ajax电话吗?

更新

根据下面的建议,我已将我的ajax请求更改为此,这解决了我的问题:

$.ajax({
    type: "GET",
    url: "/game/getpuzzleinfo",
    dataType: "json",
    cache: false,
    success: function(data) { ... }
});

9 个答案:

答案 0 :(得分:176)

IE因其对Ajax响应的积极缓存而臭名昭着。当您使用jQuery时,您可以设置一个全局选项:

$.ajaxSetup({
    cache: false
});

将导致jQuery向请求查询字符串添加随机值,从而阻止IE缓存响应。

请注意,如果您正在进行其他需要缓存的Ajax调用,那么这也会禁用它。在这种情况下,切换到使用$ .ajax()方法并为必要的请求显式启用该选项。

有关详细信息,请参阅http://docs.jquery.com/Ajax/jQuery.ajaxSetup

答案 1 :(得分:8)

提到marr75时,GET被缓存。

有几种方法可以解决这个问题。除了修改响应头之外,您还可以将随机生成的查询字符串变量附加到目标URL的末尾。这样,IE每次请求时都会认为它是一个不同的URL。

有多种方法可以执行此操作(例如使用Math.random(),日期变体等)。

这是你可以做到的一种方式:

var oDate = new Date();
var sURL = "/game/getpuzzleinfo?randomSeed=" + oDate.getMilliseconds();
$.get(sURL, null, function(data, status) {
    // your work
});

答案 2 :(得分:3)

获取始终是可缓存的。一种可行的策略是编辑响应头并告诉客户端不要缓存信息或很快使缓存过期。

答案 3 :(得分:2)

如果您正在调用ashx页面,您还可以使用以下代码禁用服务器上的缓存:

context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 

答案 4 :(得分:1)

这就是我为ajax调用所做的事情:

var url = "/mypage.aspx";
// my other vars i want to add go here
url = url + "&sid=" + Math.random();
// make ajax call

对我来说效果很好。

答案 5 :(得分:0)

这里的答案对于那些使用jQuery或出于某种原因直接使用xmlHttpRequest对象的人非常有帮助...

如果您使用自动生成的Microsoft服务代理,则解决起来并不简单。

诀窍是在事件处理程序中使用Sys.Net.WebRequestManager.add_invokingRequest方法更改请求url:

networkRequestEventArgs._webRequest._url = networkRequestEventArgs._webRequest._url + '&nocache=' + new Date().getMilliseconds(); 

我发表过关于此的博文:http://yoavniran.wordpress.com/2010/04/27/ie-caching-ajax-results-how-to-fix/

答案 6 :(得分:0)

仅使用ExtJS撰写了关于此问题的博客(http://thecodeabode.blogspot.com/2010/10/cache-busting-ajax-requests-in-ie.html

问题是因为我使用特定的url重写格式我不能使用传统的查询字符串参数(?param = value),所以我把缓存清除参数写为发布变量而不是.....我本来以为使用POST变量比GET更安全一点,因为很多MVC框架都使用模式

协议://主机/控制器/动作/参数1 / param2的

所以变量名称到值的映射会丢失,并且params只是堆叠...所以当使用GET缓存buster参数时

即。协议://主机/控制器/动作/参数1 /参数2 / no_cache122300201

no_cache122300201可能被误认为是一个可能有默认值的$ param3参数

即。

公共功能操作($ param1,$ param2,$ param3 =“默认值”) { //..// }

POSTED缓存破坏者不会发生这种情况

答案 7 :(得分:0)

如果您使用的是ASP.NET MVC,则只需在控制器操作之上添加此行:

[OutputCache(NoStore=true, Duration = 0, VaryByParam = "None")]
public ActionResult getSomething()
{

}

答案 8 :(得分:-1)

IE拥有进行此缓存的权利;为了确保项目不被缓存,应相应地设置标题。

如果您使用的是ASP.NET MVC,则可以编写ActionFilter;在OnResultExecuted中,选中filterContext.HttpContext.Request.IsAjaxRequest()。如果是,请设置响应的过期标头:filterContext.HttpContext.Response.Expires = -1;

根据http://www.dashbay.com/2011/05/internet-explorer-caches-ajax/

  

有些人更喜欢使用Cache - Control:no - 缓存标头   而不是过期。这是区别:
  缓存控制:无缓存 - 绝对没有缓存
  过期:-1 - 浏览器“通常”联系   Web服务器,通过条件更新该页面   If-Modified-Since请求。但是,该页面仍保留在磁盘缓存中   并且在适当的情况下使用而不联系遥控器   Web服务器,例如使用BACK和FORWARD按钮时   访问导航历史记录或浏览器处于离线模式时。