При написании пользовательского IHttpHandler я столкнулся с поведением, которое я не ожидал в отношении объекта HttpCachePolicy.
Мой обработчик вычисляет и устанавливает тег сущности (используя метод SetETag для HttpCachePolicy, связанный с текущим объектом ответа). Если я устанавливаю открытый элемент управления кэшированием, используя метод SetCacheability, все работает как чудо, и сервер отправляет заголовок электронного тега. Если я установлю это как приватное, заголовок электронного тега будет подавлен.
Может быть, я просто не выглядел достаточно усердно, но я не видел в спецификации HTTP / 1.1 ничего, что могло бы оправдать такое поведение. Почему вы не хотите отправлять E-Tag в браузеры, в то же время запрещая прокси хранить данные?
using System;
using System.Web;
public class Handler : IHttpHandler {
public void ProcessRequest (HttpContext ctx) {
ctx.Response.Cache.SetCacheability(HttpCacheability.Private);
ctx.Response.Cache.SetETag("\"static\"");
ctx.Response.ContentType = "text/plain";
ctx.Response.Write("Hello World");
}
public bool IsReusable { get { return true; } }
}
Вернется
Cache-Control: private
Content-Type: text/plain; charset=utf-8
Content-Length: 11
Но если мы изменим его на public, он вернется
Cache-Control: public
Content-Type: text/plain; charset=utf-8
Content-Length: 11
Etag: "static"
Я запустил это на сервере разработки ASP.NET и IIS6 до сих пор с одинаковыми результатами. Также я не могу явно установить ETag, используя
Response.AppendHeader("ETag", "static")
Обновление : возможно добавить заголовок ETag вручную при работе в IIS7, я подозреваю, что это вызвано тесной интеграцией между ASP.NET и конвейером IIS7.
Разъяснение : Это длинный вопрос, но основной вопрос заключается в следующем: Почему ASP.NET делает это, как я могу обойти это и должен ли я?
Обновление : Я собираюсь принять Ответ Тони , поскольку он по сути правильный (иди к Тони!). Я обнаружил, что если вы хотите полностью эмулировать HttpCacheability.Private, вы можете установить кеширование на ServerAndPrivate, но у вас также есть кеш вызовов. SetOmitVaryStar (true), иначе кэш добавит Vary: * заголовок к выводу, и вы не хотите этого. Я отредактирую это в ответ, когда получу разрешения на редактирование (или, если вы видите Тони, возможно, вы могли бы отредактировать свой ответ, чтобы включить этот вызов?)