Как заставить RequestCachePolicy соблюдать максимальный возраст - PullRequest
3 голосов
/ 15 апреля 2019

Я не совсем понимаю, как политики кэширования на основе времени работают при использовании HttpWebRequest.

Я вызываю метод GET WebAPI, который возвращает содержимое JSON вместе с заголовком Cache-Control, аналогично:

Cache-Control: public, max-age=60

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

Я вызываю этот API с использованием HttpWebRequest и хочу, чтобы последующие запросы обслуживались из локального кэша в течение max-age секунд, а затем извлекались с сервера по истечении срока действия контента.

Я пробовал разные комбинации с результатами, перечисленными ниже.

  1. Не указывайте RequestCachePolicy. В этом случае, как и ожидалось, все запросы отправляются на сервер.

  2. Укажите политику кэширования по умолчанию :

    var policy = new RequestCachePolicy(RequestCacheLevel.Default);
    HttpWebRequest.DefaultCachePolicy = policy;
    

    В этом случае все запросы по-прежнему отправляются на сервер. Я ожидал, что запросы будут отправляться из кэша в течение следующих max-age секунд.

  3. Укажите политику кэширования CacheIfAvailable:

    var policy = new RequestCachePolicy(RequestCacheLevel.CacheIfAvailable);
    HttpWebRequest.DefaultCachePolicy = policy;
    

    В этом случае все запросы обслуживаются из локального кэша, даже если содержимое устарело (т.е. прошло максимальное количество секунд).

Можно ли добиться того, чего я хочу, и если да, то как?

1 Ответ

1 голос
/ 24 апреля 2019

Похоже, что серверу необходимо добавить заголовок Expires к ответу в дополнение (или вместо?) К заголовку Cache-Control.Автор этого ответа заслуживает награды.

Когда присутствует заголовок Expires и используется RequestCacheLevel.Default, срок действия истекает в приложении .NET Framework, как и ожидалось: запрос подается из локального кэша до тех пор, покаистекает время истечения.

Однако в приложении .NET Core, использующем один и тот же код, все запросы отправляются на сервер, а локальный кэш не используется :( Это отдельно от темы моего оригиналавопрос, поэтому я задал новый вопрос .

...