Как исправить кеш браузера и немодифицированный ответ для JSON? jQuery.ajax ({ifModified: true, cache: true}) разрыв запроса JSON для ответа на данные - PullRequest
3 голосов
/ 25 февраля 2011

Как исправить кеш браузера и notmodified отвечать за JSON? jQuery.ajax({ifModified:true,cache:true}) JSON-запрос прерывается на data ответить.

Первый запрос браузера http://localhost/api возвращает статус 200 OK и nexts 304 Not Modified

$.ajax({
    type:"GET",
    url:'http://localhost/api', // {"content"="Hello!"}
    dataType:'json',
    cache:true,
    ifModified:true,            // Lets respond `304:notmodified`
    success:function(data,textStatus,jqXHR){
        console.debug(jqXHR.status+':'+textStatus);
        console.debug(data);    // Why on repeated request returns `undefined`?
    }
});

XHR в первый раз возвращается нормально:

200:success
Object {content="Hello!"}

но в следующий раз возвращает data undefined :

304:notmodified
undefined

Как это решить? Кажется, ошибка jQuery 1.5.1. Ожидаемый результат:

304:notmodified
Object {content="Hello!"}

Ответы [ 3 ]

1 голос
/ 01 августа 2011

Я полагаю, что именно так он и должен работать, 304 не возвращает никаких данных, он просто говорит вам, что он не изменился.

Однако, я вижу проблему, если у вас нет данных в памяти, вам нужен какой-то метод, чтобы получить их из кэша браузера. Поэтому я думаю, что решение - написать код для кеширования данных.

Я не уверен, как HTTPS работает с etags, однако HTTP-данные не всегда кэшируются (разные методы и поведение в разных браузерах и версиях), поэтому, если etags работает, вам, возможно, потребуется внедрить собственный безопасный кэш в любом случае.

0 голосов
/ 29 сентября 2012

Когда вы получаете 304, вы должны повторно запросить данные, но с флагом «ifModified», установленным в false.После этого к запросу будут применены обычные правила кэширования, и вы получите кэшированные данные.

Например, в контроллере MVC ...

        DateTime pageLastUpdated = <.....>

        if (Request.Headers["If-Modified-Since"] != null)
        {
            var dt = DateTime.Parse(Request.Headers["If-Modified-Since"] as string);

            if (pageLastUpdated.Date == dt.Date && pageLastUpdated.Hour == dt.Hour && pageLastUpdated.Minute == dt.Minute && pageLastUpdated.Second == dt.Second) {
              Response.Cache.SetCacheability(HttpCacheability.NoCache);                    
              return new HttpStatusCodeResult(304, "notmodified");
            }
        }

        Response.Cache.SetCacheability(HttpCacheability.Private);
        Response.Cache.SetVaryByCustom("*");
        Response.Cache.SetExpires(pageLastUpdated.AddDays(1));
        Response.Cache.SetLastModified(pageLastUpdated);

        // now return the Json
        return Json(new {........});

Отправленные данные кэшируютсяклиент на срок до 1 дня.

function loadJson(url, params, onLoaded) {
  // initial request 
  $.ajax({
    type: 'GET',
    dataType: 'json',
    url: url,
    data: params,
    cache: true,
    ifModified: true, // forces check with server
    success: function (result, textStatus, jqXHR) {

        // if 304, re-request the data
        if (result === undefined && textStatus == 'notmodified') {
            $.ajax({
                type: 'GET',
                dataType: 'json',
                url: url,
                data: params,
                cache: true,
                ifModified: false, // don't check with server
                success: function (cachedResult, textStatus, jqXHR) {
                    onLoaded(cachedResult);
                }
            });
        }
        else
            onLoaded(result);
    }
});
0 голосов
/ 01 апреля 2011

Попробуйте добавить случайное число в конец вашего URL в качестве параметра.

random_number = Math.floor(Math.random()*10101010101)
url:'http://localhost/api?' + random_number
...