Я реализую приложение, которое выполняет много сетевых вызовов для остальных API, которые мы также контролируем. Недавно мы решили внедрить заголовки кэширования на стороне сервера, чтобы сэкономить ценное сетевое и серверное время. Поскольку мы заранее не знаем, как долго данные будут действительны, мы не отправляем заголовки Cache-control: max-age
или Expires
, все, что мы делаем, это отправляем заголовок Last-Modified
вместе с E-tag
, поэтому мы всегда обращаемся к серверу, но в большинстве случаев ответы приходят довольно быстро. времена с 304
. Сначала все работало нормально, многие запросы кэшировались. Однако в приложении возникают случайные ошибки данных из-за кэширования.
По какой-то причине я не могу понять, в какой-то момент запросы локально кэшируются и используются как "обновляемые" данные без обращения к серверу, хотя на самом деле это не так. Проблема сохраняется до тех пор, пока не пройдет некоторое время. Затем все снова идет на сервер нормально, точно так же, как с заголовком cache-control
, но без него!. Итак, мой вопрос:
Как NSURLCache
вместе с NSURLConnection
решить, что конкретный запрос не нужно отправлять в онлайн, если первоначальный запрос не содержал заголовков Cache-control: max-age
или Expires
? Кто-нибудь сталкивался с подобным эффектом? И как решить, не удаляя весь кеш?
Еще немного справочной информации:
- Я использую AFNetworking, но он зависит от
NSURLConnection
, поэтому не думаю, что это что-то меняет - Используемый кеш — это экземпляр
[NSURLCache sharedURLCache]
по умолчанию. Это запрос
GET
, и когда я проверяю заголовки из кэшированного ответа, я получаю следующее:po [response allHeaderFields]
"Access-Control-Allow-Headers" = "Content-Type"; "Access-Control-Allow-Methods" = "GET, POST, DELETE, PUT"; "Access-Control-Allow-Origin" = "*"; Connection = "keep-alive"; "Content-Encoding" = gzip; "Content-Length" = 522; "Content-Type" = "application/json"; Date = "Mon, 02 Sep 2013 08:00:38 GMT"; Etag = "\"044ad6e73ccd45b37adbe1b766e6cd50c\""; "Last-Modified" = "Sat, 31 Aug 2013 10:36:06 GMT"; Server = "nginx/1.2.1"; "Set-Cookie" = "JSESSIONID=893A59B6FEFA51566023C14E3B50EE1E; Path=/rest-api/; HttpOnly";
Я не могу предсказать или воспроизвести, когда произойдет ошибка, поэтому решения, основанные на удалении кеша, не подходят.
- Я использую iOS5+