2010-10-20 1 views
1

У меня есть страница, которая делает один и тот же запрос JSONP несколько раз при загрузке одной страницы. В большинстве браузеров это работает нормально, но Safari кэширует ответ локально до тех пор, пока страница не будет перезагружена. Даже когда я отправляю обратно ответ кэша Cache-Control: no-cache.Сафари кэширует запросы JSONP локально

Рассмотрим следующий пример кода:

var plcbCnt = 0; 
var plcb = "plcb" + plcbCnt; 
while(window[plcb]){ 
    plcb = "plcb" + (++plcbCnt); 
} 

$.ajax({ 
    "url": "http://myserver.com/echoDate", 
    "dataType": 'jsonp', 
    "jsonp": "cb", 
    "jsonpCallback": plcb, 
    "success": function(resp){ 
     $("#pants").html($("#pants").html() + resp + "<br/>"); 
    } 
}); 

Первый запрос возвращает:

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Length: 28 
Content-Type: application/javascript 
Expires: -1 
Server: Microsoft-IIS/7.5 
X-AspNet-Version: 2.0.50727 
Set-Cookie: ASP.NET_SessionId=g0zwq2qiaheh4145cudddmjo; path=/ 
X-Powered-By: ASP.NET 
Date: Wed, 20 Oct 2010 18:22:12 GMT 

plcb0('634231777326425375'); 

Последующие вызовы служат из локального кэша, а не попав на сервер, как они должны.

Возможно, вам интересно, какая именно эта деталь в начале - настройка функции обратного вызова. Я мог бы просто использовать случайное число, верно? Не совсем. Мы избегаем дополнительной работы рендеринга путем кэширования всего вывода на основе запрошенного URL-адреса. Поэтому, если я изменяю имя функции обратного вызова при каждом запросе, я теряю преимущества кеша сервера.

Лучшее, о чем я могу думать, это добавить в запрос параметр мусора и сделать кеш-память сервера из URL-адреса при создании ключа кеша. Но я хотел посмотреть, есть ли вначале лучший вариант ... что-то о Safari, о котором я не знаю.

+0

Почему вы не используете getJSON? http://api.jquery.com/jQuery.getJSON/ Делает то же самое в конце. – epascarello

+0

getJSON не имеет гибкости для определения обратного вызова, как я это делаю. Использует значение по умолчанию, которое создает случайное число каждый раз. –

ответ

0

кажется, что это происходит на IE также можно установить кэш ложным в Ajax вызова:

$.ajax({ 
    /*cache: false,*/ 
    "url": "http://myserver.com/echoDate", 
    "dataType": 'jsonp', 
    "jsonp": "cb", 
    "jsonpCallback": plcb, 
    "success": function(resp){ 
     $("#pants").html($("#pants").html() + resp + "<br/>"); 
    } 
}); 
+0

cache = false просто добавляет параметр мусора, о котором я упомянул в конце моего вопроса. (по крайней мере, я думаю это - все) –

+0

(двойной проверено источник jQuery. Это все, что он делает) –

1

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

var callback = '#call' + new Date().getTime(); 
$.ajax({ 
    "url": "http://myserver.com/echoDate" + callback, 
    "dataType": 'jsonp', 
    "jsonp": "cb", 
    "jsonpCallback": plcb, 
    "success": function(resp){ 
     $("#pants").html($("#pants").html() + resp + "<br/>"); 
    } 
});