У меня серьезная проблема с результатами кэширования Internet Explorer из запроса JQuery Ajax.
У меня есть заголовок на моей веб-странице, который обновляется каждый раз, когда пользователь переходит на новую страницу. Как только страница загружена, я делаю это
$.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, а затем войдя в систему и запустив новую головоломку.
В каждом браузере, который я тестировал (Google Chrome, 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) { ... }
});
Ответы:
IE известен своим агрессивным кэшированием ответов Ajax. Поскольку вы используете jQuery, вы можете установить глобальную опцию:
что заставит jQuery добавить случайное значение в строку запроса, тем самым не позволяя IE кэшировать ответ.
Обратите внимание, что если у вас есть другие Ajax-вызовы, где вы хотите кэшировать, это отключит его и для них. В этом случае переключитесь на использование метода $ .ajax () и включите эту опцию явно для необходимых запросов.
См. Http://docs.jquery.com/Ajax/jQuery.ajaxSetup для получения дополнительной информации.
источник
/
. Измените его на/index.php
какой-либо полный URL-адрес. Или добавить некоторые поддельные Params себя как/?f=f
Как упоминалось в marr75 ,
GET
кешируются.Есть несколько способов борьбы с этим. Помимо изменения заголовка ответа, вы также можете добавить случайно сгенерированную переменную строки запроса в конец целевого URL. Таким образом, IE будет думать, что это новый URL каждый раз, когда его запрашивают.
Есть несколько способов сделать это (например, используя
Math.random()
, изменение даты и т. Д.).Вот один из способов сделать это:
источник
Получает всегда кешируется. Одна из стратегий, которая может сработать, - это отредактировать заголовок ответа и сказать клиенту, чтобы он не кэшировал информацию или очень скоро истек срок действия кэша.
источник
Если вы вызываете страницу Ashx, вы также можете отключить кэширование на сервере с помощью следующего кода:
источник
это то, что я делаю для вызовов ajax:
это работает довольно хорошо для меня.
источник
NickFitz дает хороший ответ, но вам нужно отключить кеширование и в IE9. Чтобы нацелиться только на IE8 и IE9, вы можете сделать это;
источник
Ответы здесь очень полезны для тех, кто использует jQuery или по какой-то причине напрямую использует объект xmlHttpRequest ...
Если вы используете автоматически сгенерированный прокси службы Microsoft, это не так просто решить.
Хитрость заключается в том, чтобы использовать метод Sys.Net.WebRequestManager.add_invokingRequest в обработчике событий, чтобы изменить URL запроса:
Я написал в блоге об этом: http://yoavniran.wordpress.com/2010/04/27/ie-caching-ajax-results-how-to-fix/
источник
Только что написал блог по этому вопросу только с использованием ExtJS ( http://thecodeabode.blogspot.com/2010/10/cache-busting-ajax-requests-in-ie.html )
Проблема заключалась в том, что, когда я использовал определенный формат переписывания URL-адресов, я не мог использовать обычные параметры строки запроса (? Param = value), поэтому вместо этого мне пришлось написать параметр очистки кэша ..... я бы подумал что использование переменных POST немного безопаснее, чем GET, просто потому, что многие MVC-фреймворки используют шаблон
протокол: // хост / контроллер / действие / param1 / param2
и поэтому отображение имени переменной в значение теряется, а параметры просто складываются ... так что при использовании параметра GET кэш-буфера
т.е. протокол: // хост / контроллер / действие / param1 / param2 / no_cache122300201
no_cache122300201 можно принять за параметр $ param3, который может иметь значение по умолчанию
т.е.
действие публичной функции ($ param1, $ param2, $ param3 = "значение по умолчанию") {//..//}
никаких шансов на то, что это случится с кешами POSTED
источник
Если вы используете ASP.NET MVC, достаточно добавить эту строку поверх действия контроллера:
источник
IE имеет право делать это кеширование; чтобы гарантировать, что элемент не кэшируется, заголовки должны быть установлены соответственно.
Если вы используете ASP.NET MVC, вы можете написать
ActionFilter
; вOnResultExecuted
, проверитьfilterContext.HttpContext.Request.IsAjaxRequest()
. Если это так, установите заголовок expire ответа:filterContext.HttpContext.Response.Expires = -1;
Согласно http://www.dashbay.com/2011/05/internet-explorer-caches-ajax/ :
источник