$.getJSON возвращает кэшированные данные в IE8

Я играю с ASP.net MVC и JQuery на данный момент. Я сталкивался с поведением, которое, похоже, не имеет смысла.

Я вызываю функцию JQuery $.getJSON для заполнения некоторых div. Событие запускается в событии $(document).ready. Это прекрасно работает.

Существует небольшой AJAX.BeginForm, который добавляет другое значение, которое будет использоваться при заполнении div. Он правильно называет удалённую функцию и при успешном вызове использует функцию javascript для повторного заполнения div.

Вот странная часть: в FireFox и Chrome - все работает. НО В IE8 (бета-версия) этот второй вызов заполняемого Div script (который вызывает функцию $.getJSON) получает кешированные данные и не запрашивает сервер!

Надеюсь, что этот вопрос имеет смысл: в ореховой оболочке - Почему $.getJSON получает кешированные данные? И почему это только влияет на IE8?

Ответ 1

Просто, чтобы вы знали, Firefox и Chrome рассматривают весь запрос Ajax как не подлежащий кэшированию. IE (все версии) обрабатывают вызов Ajax так же, как и другой веб-запрос. Вот почему вы видите это поведение.
Как заставить IE загружать данные по каждому запросу:

  • Как вы сказали, используйте параметр "cache" или "nocache" в JQuery
  • Добавить случайный параметр в запрос (уродливый, но работает:))
  • На стороне сервера установите cachability (например, используя атрибут, см. ниже).

код:

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

Ответ 2

Вот как это сработало для меня...

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

Ответ 3

Спасибо Кенту за ваш ответ. Использование $.ajax('{cache: no}'); работал отлично. [Править]

Или, по крайней мере, я думал, что сделал. Кажется, что jquery $.getJSON не читает никаких изменений, внесенных в объект $.ajax.

Решение, которое закончило работу, заключалось в том, чтобы вручную добавить новый параметр

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

разрешение даты только до минуты; что эффективно означает, что это решение все еще кэшируется в течение одной минуты. Это приемлемо для моих целей.

Ответ 4

Я решил эту же проблему, поместив следующий атрибут в Action в контроллере:

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

Ответ 5

Если вы используете 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");
    }

Ответ 6

Вам может потребоваться отправить кэш-прерыватель.

Я бы рекомендовал использовать $.ajax({cache: no)) на всякий случай (добавляет случайный суффикс к запросу get)

(Я обычно использую $.ajax всюду в эти дни, более настраиваемый)