Я думаю, вы должны просто использовать
HttpContext.Current.Response.Cache.SetMaxAge (new TimeSpan (0));
или
HttpContext.Current.Response.Headers.Set ("Cache-Control", "private, max-age=0");
для установки max-age=0
, что не означает ничего, кроме повторной проверки кэша (см. здесь ). Если в заголовке будет дополнительно установлено значение ETag
с некоторой пользовательской контрольной суммой хэша из данных, ETag из предыдущего запроса будет отправлен на сервер. Сервер может либо вернуть данные, либо, если данные точно такие же, как и раньше, он может вернуть пустое тело и HttpStatusCode.NotModified
в качестве кода состояния. В случае, если веб-браузер будет получать данные из кэша локального браузера.
Я рекомендую вам использовать Cache-Control: private
, что вызывает две важные вещи: 1) отключить кэширование данных на прокси-сервере, который иногда имеет очень агрессивные настройки кэширования 2) это разрешит кэширование данных, но не разрешит совместное использование кеша с другими пользователями. Это может решить проблемы конфиденциальности, потому что данные, которые вы возвращаете одному пользователю, могут быть недоступны для чтения другим пользователям. Кстати, код HttpContext.Current.Response.Cache.SetMaxAge (new TimeSpan (0))
по умолчанию устанавливает Cache-Control: private, max-age=0
в заголовке HTTP. Если вы хотите использовать Cache-Control: public
, вы можете использовать SetCacheability (HttpCacheability.Public);
для перезаписи поведения или использовать Headers.Set
вместо Cache.SetMaxAge
.
Если вы заинтересованы в изучении дополнительных параметров кэширования протокола HTTP, я рекомендую вам прочитать руководство по кэшированию .
ОБНОВЛЕНО : Я решил написать больше информации, чтобы прояснить свою позицию. Соответствует информации из Википедии, даже такие старые веб-браузеры, как Mosaic 2.7, Netscape 2.0 и Internet Explorer 3.0 поддерживают март 1996 года, предварительный стандарт HTTP / 1.1, описанный в RFC 2068. Так что я полагаю (но не проверьте это), что старые веб-браузеры поддерживают HTTP-заголовок max-age=0
. В любом случае Netscape 2.06 и Internet Explorer 4.0 окончательно поддерживают HTTP 1.1.
Итак, сначала спросите себя: какие стандарты HTML вы используете? Вы все еще используете HTML 2.0 вместо более поздней версии HTML 3.2, опубликованной в январе 1997 года? Я предполагаю, что вы используете как минимум HTML 4.0, опубликованный в декабре 1997 года. Поэтому, если вы создаете свое приложение хотя бы в HTML 4.0, ваш сайт может быть ориентирован на веб-клиентов, которые поддерживают HTTP 1.1, и игнорировать (не поддерживать) веб-клиенты, которые не поддерживает HTTP 1.1.
Теперь о других заголовках "Cache-Control" как "private, max-age = 0". Включение заголовков на мой взгляд является чистой паранойей . Поскольку у меня возникла некоторая проблема с кэшированием, я также попытался включить другие заголовки, но позже, внимательно прочитав раздел 14.9 RFC2616, я использую только «Cache-Control: private, max-age = 0».
Единственный заголовок "Cache-Control", который может быть дополнительно обсужден, это "must-revalidate", описанный в разделе 14.9.4, на который я ссылался ранее. Вот цитата:
Директива must-revalidate необходима для поддержки надежного
работа для определенных функций протокола. При любых обстоятельствах
Кеш HTTP / 1.1 ДОЛЖЕН подчиняться директиве must-revalidate; особенно,
если кеш не может достичь исходного сервера по какой-либо причине, он ДОЛЖЕН
создать ответ 504 (время ожидания шлюза).
Серверы ДОЛЖНЫ отправить директиву must-revalidate, если и только если
невозможность повторной проверки запроса объекта может привести к
неправильная операция, такая как молча
сделка. Получатели НЕ ДОЛЖНЫ предпринимать автоматические действия, которые
нарушает эту директиву, и НЕ ДОЛЖЕН автоматически предоставлять
непроверенная копия объекта, если повторная проверка не удалась.
Хотя это
не рекомендуется, пользовательские агенты работают в условиях серьезного подключения
ограничения МОГУТ нарушать эту директиву, но, если это так, ДОЛЖНЫ явно
предупредить пользователя о том, что был предоставлен неподтвержденный ответ.
Предупреждение ДОЛЖНО быть предоставлено при каждом недействительном доступе и ДОЛЖНО
требуется явное подтверждение пользователя.
Иногда, если у меня возникают проблемы с подключением к Интернету, я вижу пустую страницу с сообщением «Время ожидания шлюза». Это происходит от использования директивы must-revalidate. Я не думаю, что сообщение «Gateway Timeout» действительно поможет пользователю.
Таким образом, люди, которые предпочитают начинать процедуру саморазрушения, если он слышит сигнал «Занят» по вызову своему боссу, должны дополнительно использовать директиву must-revalidate в заголовке «Cache-Control». Другим людям я рекомендую просто использовать «Cache-Control: private, max-age = 0» и ничего более.