2016-05-31 12 views
1

В образце демонстрационного приложения я использую React Native для совершения сетевых вызовов. Под капотом React Native использует NSURLSession с NSURLRequestUseProtocolCachePolicy в качестве политики кэширования по умолчанию. Когда сеть сделан вызов, ответ, возвращаемый службой содержит следующие элементы управления кэш-заголовки:Использование must-revalidate с NSURLSession через React Native

public, max-age=10, must-revalidate 

Что я могу заметить, что NSURLSession не чтить 10 секунд, если max-revalidate присутствует. Напротив, если последнее не присутствует, когда новый сетевой вызов выполняется в пределах 10 секунд, возвращается ответ кэша, в противном случае выполняется новый вызов.

На основании раздела 14.9.4 Cache Revalidation and Reload Controls это не должно быть ожидаемое поведение, но, возможно, я ошибаюсь.

Поскольку кэш может быть сконфигурирован, чтобы игнорировать время истечения срока с сервером указан , и потому, что запрос клиента может включать в себя подразумевают наиболее несвежий директивы (который имеет такой же эффект), протокол также включает в себя механизма исходный сервер требует повторной проверки кэша записи при любом последующем использовании. Когда директива must-revalidate имеет значение , присутствующую в ответе, полученном кешем, этот кеш НЕ ДОЛЖЕН использовать запись после того, как она станет устаревшей, чтобы ответить на последующий запрос без предварительной проверки его с исходным сервером. (Т.е., кэш ДОЛЖЕН сделать из конца в конец Ревалидации каждый раз, если, основываясь исключительно на сервере происхождений истекает или значение максимального возраста, в кэше ответ несвежих.)

Я нашел полезное обсуждение на эту тему: HTTP Cache Control max-age, must-revalidate. На основе обсуждения, кажется, что протокол является немного

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

Очень странная вещь, что если я сделать то же самое с Android, используя как max-age и must-revalidate поведение является правильным. После 10 секунд будет сделан новый запрос. В течение 10 секунд запрос не запрашивается.

Любой ключ?

ответ

0

Я сделал несколько тестов, и кажется, что в iOS (используя NSURLSession), когда установлен must-revalidate, max-age не принимается к сведению. Для Android это другая история, где эти два значения могут использоваться вместе.

P.S. если у кого-то эксперта по протоколу HTTP есть подсказка по этому вопросу, пожалуйста, дайте мне знать.