Вопрос по query-string, html – Случайная Querystring, чтобы избежать IE кеширования

10

Это хорошо известная проблема, что IE кеширует слишком много HTML, даже когдаCache-Control: no-cache или жеLast-Modified заголовок на каждой странице.

Такое поведение действительно беспокоит при работе со строками запросов для получения динамической информации, так как IE считает, что этота же страница (Т.е .:http://example.com/?id=10) и обслуживает кэшированную версию.

мы решили добавить случайное число или временную строку в строку запроса (как и другие) как этоhttp://example.com/?id=10&t=2009-08-06_13:12:56 что я просто игнорирую серверную сторону.

Есть ли лучший вариант? Есть ли другой, более чистый способ сделать это? Я'я знаю, чтоPOST ISN»t кешируется, но семантически правильно использоватьGET Вот.

Что я'я спрашиваю: есть лидругой путь делать это? Esteban Küber
Кстати, ваше утверждение неверно. IE не "кеш слишком много HTML, См. Www.fiddler2.com/redir/?id=httpperf для обсуждения кеширования в IE. EricLaw
используя общий $ .ajax, как предложено в предыдущем постеstackoverflow.com/a/1767342/5969842 помог решить проблему без использования случайного числа ravikumar
@Eric, IE имеет некоторые неожиданные / противоречивыеповедение по поводу кеширования. Esteban Küber

Ваш Ответ

6   ответов
11

Предполагая, что вы используете jQuery, вместо использования $ .get или $ .getJson, используйте более общий $ .ajax и явно установите значение кэша в false. Ниже приведен пример:

$.ajax({
        url: "/Controller/Action",
        cache: false,
        type: "GET",
        dataType: "json",
        success: function(data, textStatus) {
                         alert("success");
                 }
    });

Требуется немного больше кода (хотя и немного), чем при использовании .getJson или .get, но это решит проблему без добавления случайных чисел.

я должен найти, что с помощью запроса GET в IE мы должны установить, чтобы не кэшировать HTML, и я установил 'кеш: ложь и это помешало IE принести результат из кеша .. спасибо Lucky
0

Вы пытались добавитьETag заголовок в ответе? Вы можете использовать случайную или контрольную сумму сгенерированной страницы, чтобы кэшированная версия обслуживалась, когда это уместно.

я не уверен чтоЭто поведение IE, но с последними версиями оно должно работать.

Смотрите такжеHTTP RFC раздел по ETag

2

Использование случайного числа (не метки времени) в строке запроса или фактическое изменение имени файла - это два рекомендуемых метода. Стив Соудерс иYAHOO!группа производительности опубликовалтонна полезной информации и практики ониобнаружили и разработали, оптимизируя один из мировыхс наиболее посещаемых свойств.

0

У меня та же проблема, но позаботьтесь, в одну секунду может быть много запросов. Вот почему я использую это:

$.getJSON("http://server/example?param=value&dummy=" + Math.random(), ...);
Ну, я нене хочутот же клиент ударяя мой сервернесколько таймеров в секундутак что я нене против, если показанная информация - 1 секунда. Конечно, на выходе получается простой текст для людей. Esteban Küber
2

Итак, в конце концов, единственный надежный способ сделать это (благодаря IE6) - это использоватьслучайный, или жеограниченный по времени Строка запроса.

Вы могли бы использоватьстрока запроса с ограничением по времени который меняется только каждые 15 секунд (или любое другое время), так что вы 'уменьшите количество обращений к серверу, как высмотреть локально кэшированный контент за эти 15 секунд.

Если у тебя есть стандарт уступчивый браузерСойти можно только с помощьюETags.

 ... (благодаря IE6) это ... " и благодаря IE7 я еще не тестировал IE8. Marco Demaio
Вы генерируетеслучайный» часть строки запроса с клиентской стороны JavaScript, как показано наstackoverflow.com/questions/1234246/... Таким образом, все будет иначекаждый раз get или жеpost готово." Esteban Küber
Это снова не удастся, если пользователь вернется на страницу с помощью кнопки «Назад» и выполнит обновление на странице. Удалось ли вам найти надежное решение, которое работает во всех случаях? Благодарю. lostInTransit
6

Вы также можете использовать текущее время Unix в миллисекундах, чтобы избежать проблем со многими запросами в одну секунду (гораздо реже иметь несколько запросов в одну миллисекунду)

var url = "http://whatever.com/stuff?key=value&ie=" + (new Date()).getTime();

Похожие вопросы