Cache-control: no-store, must-revalidate не отправляется браузеру клиента в IIS7 + ASP.NET MVC

Я пытаюсь убедиться, что определенная страница никогда не кэшируется и никогда не отображается, когда пользователь нажимает кнопку "Назад". Этот очень высоко оцененный ответ (в настоящее время 1068 upvotes) говорит, чтобы использовать:

Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");

Однако в IIS7/ASP.NET MVC, когда я отправляю эти заголовки, вместо этого клиент видит эти заголовки ответов:

Cache-control: private, s-maxage=0 // that not what I set them to
Pragma: no-cache
Expires: 0

Что случилось с заголовком управления кешем? Заменяет ли что-то, родное IIS7 или ASP.NET? Я проверил свое решение, и у меня нет кода, который перезаписывает этот заголовок.

Когда я добавляю Response.Headers.Remove("Cache-Control"); во-первых, это не имеет значения:

Response.Headers.Remove("Cache-Control");
Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");

Когда я добавляю атрибут [OutputCache]:

[OutputCache(Location = OutputCacheLocation.None)]
public ActionResult DoSomething()
{
   Response.Headers.Remove("Cache-Control");
   Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
   Response.AppendHeader("Pragma", "no-cache");
   Response.AppendHeader("Expires", "0");

   var model = DoSomething();
   return View(model);
}

Затем заголовки ответов клиента меняются на:

Cache-control: no-cache
Pragma: no-cache
Expires: 0

Что ближе, но все равно не заголовки, которые я хочу отправить. Где эти заголовки переопределяются и как я могу остановить его?

EDIT: я проверил, и неправильные заголовки отправляются в Chrome, FF, IE и Safari, поэтому он выглядит как проблема с сервером, а не проблема, связанная с браузером.

Ответы

Ответ 1

Через пробную версию и ошибку я обнаружил, что один из способов правильно настроить заголовки для IIS7 в ASP.NET MVC:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");

Первая строка устанавливает Cache-control в no-cache, а вторая строка добавляет другие атрибуты no-store, must-revalidate.

Это может быть не единственный способ, но предоставляет альтернативный метод, если сбой более простой Response.AppendHeader("Cache-control", "no-cache, no-store, must-revalidate");.

Другие связанные с IIS7 вопросы управления кешем, которые могут быть решены этим: