IIS/ASP.NET отвечает с контролем кеша: закрытый для всех запросов

Почему все ответы ASP.NET содержат Cache-Control: private? Даже ответ 404? Есть ли что-то в IIS, которое устанавливает это значение по умолчанию, и есть ли способ его настроить? Или есть что-то в ASP.NET, который устанавливает это?

Для динамического контента (т.е. всех результатов MVC) я бы не хотел, чтобы он был кэширован браузером, поскольку он динамический и может меняться в любое время. Статический контент размещается на CDN, поэтому IIS не обслуживается.

Изменить:

Чтобы прояснить, я очень хорошо понимаю, что Cache-Control: private есть, разница между private, public, no-store и т.д. и как/когда их использовать. Вопрос, который у меня есть, - это почему Cache-Control: private по умолчанию добавляется IIS/ASP.NET и как предотвратить его добавление по умолчанию. Я понимаю, что полезно кэшировать динамические страницы, но в моем приложении я не хочу кэшировать динамические страницы/ответы. Например, я не хочу, чтобы ответы XHR JSON были кэшированы, поскольку они содержат динамический контент. К сожалению, сервер автоматически добавляет Cache-Control: private ко всем ответам, поэтому мне приходится вручную переопределять его везде.

Как воспроизвести: Откройте визуальную студию и создайте новую платформу ASP.NET(да, фреймворк, не ядро). Мы не можем перенести наше системное ядро ​​еще) с помощью MVC проект. Теперь запустите проект в IIS Express (просто нажмите кнопку воспроизведения) и используйте F12 devtools в браузере, чтобы посмотреть ответ HTTP. Вы увидите, что он содержит Cache-Control: private. Мой вопрос в том, что добавляет этот заголовок и как я могу предотвратить его добавление по умолчанию?

введите описание изображения здесь

Ответ 1

Добавлю свой интерес к отличным ответам сообщества;

1. http атрибут заголовка кэширования Cache-Control: по умолчанию IIS/ASP.NET добавляется по умолчанию?

Директивы запроса кеша

Стандартные директивы Cache-Control, которые могут использоваться клиентом в HTTP-запросе.

    Cache-Control: max-age=<seconds>
    Cache-Control: max-stale[=<seconds>]
    Cache-Control: min-fresh=<seconds>
    Cache-Control: no-cache 
    Cache-Control: no-store
    Cache-Control: no-transform
    Cache-Control: only-if-cached

Директивы кэширования ответа

Стандартные директивы Cache-Control, которые могут использоваться сервером в ответе HTTP.

    Cache-Control: must-revalidate
    Cache-Control: no-cache
    Cache-Control: no-store
    Cache-Control: no-transform
    Cache-Control: public
    Cache-Control: private
    Cache-Control: proxy-revalidate
    Cache-Control: max-age=<seconds>
    Cache-Control: s-maxage=<seconds>

IIS использует безопасный и более очевидный/полезный вариант по умолчанию, который оказывается приватным

2. как предотвратить добавление по умолчанию?

IIS/asp.net позволяет настраивать эту настройку со дня ее появления, например этот, ref1, ref2, ref3, ref4 и

Пространство имен System.Web

Пространство имен System.Web предоставляет классы и интерфейсы, которые обеспечивают связь между браузером и сервером. Это пространство имен включает класс System.Web.HttpRequest, который предоставляет обширную информацию о текущем HTTP-запросе; класс System.Web.HttpResponse, который управляет выводом HTTP клиенту; и класс System.Web.HttpServerUtility, который обеспечивает доступ к утилитам и процессам на стороне сервера. System.Web также включает в себя классы для управления файлами cookie, передачи файлов, информации об исключениях и управления кэшем вывода.

protected void Application_BeginRequest()
{
  Context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
}

Ответ 2

Ответ от RickNZ, скопированный из https://forums.asp.net

Cache-Control private говорит, что для того, чтобы клиент мог кэшировать страницу, при условии, что срок ее действия истекает. Выдача может быть предоставлена ​​с помощью Cache-Control: max-age или с HTTP-заголовком Expires. В случае по умолчанию на странице установлено, что срок действия истекает немедленно, что означает, что он не будет кэшироваться.

Одна из целей Cache-Control: private - действительно рассказать промежуточным прокси, что они не должны кэшировать страницу.

Кстати, только потому, что страница динамична, это не значит, что ее никогда нельзя кэшировать. Существует много случаев, когда кэширование динамической страницы подходит. Вы можете кэшировать не только на клиенте, но и в прокси-серверах и в кеше вывода сервера.

Дополнительная информация:

IIS 7.0 - IIS добавляет "private" к кеш-контролю, где это происходит

Частные и общедоступные в кэше-контроле

https://msdn.microsoft.com/en-us/library/ms524721(v=vs.90).aspx

https://msdn.microsoft.com/en-us/library/system.web.httpcacheability(VS.71).aspx

https://forums.asp.net/t/1443346.aspx?Cache+control+private+

https://forums.asp.net/t/2052325.aspx?Remove+the+private+value+from+the+Cache+Control+in+the+Response+Header

Ответ 3

TL; DR

  • Кэширование по умолчанию для динамических страниц ASP.NET не используется. Вам нужно приложить усилия, чтобы включить кеширование в ASP.NET.
  • Наличие заголовка "Cache-Control: private" вовсе не означает, что кешированная версия страницы будет использоваться для повторных запросов.

-

Существует очень простой тест для проверки вышеуказанных утверждений. Создайте действие, которое возвращает текущее время:

public ActionResult Index()
{
    ViewBag.CurrTime = DateTime.Now.ToString("T");
    return View();
}

Вид:

@{
    ViewBag.Title = "Home Page";
}

<h1>@ViewBag.CurrTime</h1>

Если вы обновите такую ​​страницу в abrowser, вы увидите новое время по каждому запросу:

введите описание изображения здесь

введите описание изображения здесь

Существует возможность использовать кеширование с помощью ASP.NET MVC, но вы должны приложить некоторые усилия для его включения. Подробнее см. статью.

Если, несмотря на это, вы по какой-то причине хотите исключить любую возможность кэширования, вы можете сделать это, установив определенные HTTP-заголовки. Существует большой SO ответ, в котором перечислены, какие заголовки должны быть установлены:

Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0

Вы можете использовать фильтр действий для установки этих заголовков в каждом ответе ASP.NET:

public class CachingHeadersFilterAttribute : ActionFilterAttribute
{
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        var response = filterContext.HttpContext.Response;

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

        base.OnResultExecuted(filterContext);
    }
}

В FilterConfig.cs(автоматически созданный в шаблоне ASP.NET MVC):

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new CachingHeadersFilterAttribute());
    }
}

Ниже приведены заголовки результатов ответа:

HTTP/1.1 200 OK
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Content-Type: text/html; charset=utf-8
Expires: -1
Vary: Accept-Encoding
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RDpcRHJvcGJveFxwcm9nXFN0YWNrT3ZlcmZsb3dcUTQ3MjI0NTYxQ2FjaGVcUTQ3MjI0NTYxQ2FjaGU=?=
X-Powered-By: ASP.NET
Date: Mon, 13 Nov 2017 17:44:33 GMT
Content-Length: 837

Как вы видите, нет заголовка "Cache-Control: private".

Но опять же, я не вижу причины, по которой вы должны добавить такой фильтр в свое приложение.

Ответ 4

что добавляет этот заголовок?

IIS 7 и более поздние версии (включены в установку по умолчанию) отправляют его веб-клиентам как один из связанных с кешем HTTP-заголовков.

и как я могу предотвратить его добавление по умолчанию?

Я описываю два способа отключения механизма кэширования (подход на стороне сервера и подход на стороне клиента) с акцентом на стороне сервера на основе вашего вопроса:

Подход на стороне сервера

Выполните следующие действия. Внутри Диспетчера служб IIS, чтобы изменить значение Cache-Control (пока я думаю, что это работает для статического содержимого):

  • На панели Подключения перейдите на сайт, приложение или каталог, для которого вы хотите отключить кеширование.
  • В области Главная дважды щелкните Заголовки ответов HTTP.
  • Нажмите Установите общие заголовки... в панели Действия.
  • Установите флажок истечет веб-контент, выберите вариант истечения срока действия через определенный интервал или на конкретное время, и затем нажмите "ОК".

Один из способов - аннотировать ваш контроллер следующим образом, который является достаточно мощным, а заголовки ответов содержат заголовок Cache-Control: public, max-age=0.:

[OutputCache(Duration = 0)]
public class SomeController : Controller  {

}

Вы также можете определить профиль кэша в файле приложения Web.config и в профиле, включите параметры duration и varyByParam:

<caching>
  <outputCacheSettings>
    <outputCacheProfiles>
      <add name="nocache" duration="0" 
        varyByParam="none" />
    </outputCacheProfiles>
  </outputCacheSettings>
</caching>

Затем используйте его [OutputCache CacheProfile="nocache"] перед действием/контроллером.

Обратите внимание, что имеется конфигурация в файле web.config(далее), которая не предотвращает кеширование. Вместо этого он просто указывает, что не следует применять какой-либо механизм кэширования. Просто отключив выходной кеш, мы получаем заголовки кеша по умолчанию, используемые ASP.net MVC, который возвращается к Cache-Control: private, тем самым снова открывая браузер для возможности кэширования запросов.

<caching>
    <outputCache enableOutputCache="false" />
</caching>

Клиентский подход

Используя cache: false внутри вашего js-запроса, например:

$.ajax({
    type: 'GET',
    cache: false,
    url: '/nation',
    ...
});

Для дополнительной информации посетите страницу

Ответ 5

Решение вопроса:

Вы увидите, что он содержит Cache-Control: private. Мой вопрос в том, что добавляет этот заголовок, и как я могу предотвратить его добавление по умолчанию?

Короткий ответ: как отмечали другие, это значение по умолчанию IIS (7 +).

Чтобы ответить более полно: если вы хотите контролировать или изменять настройку по умолчанию Cache-Control: private для кэширования HTTP-запросов на стороне сервера.

Это будет зависеть от вашей конкретной версии IIS, в которой вы работаете, и от того, насколько конкретно вы хотите быть с вашей модификацией. В общем говоря, вы можете сделать это, используя HTTP-ответные заголовки Диспетчер IIS = > Вид функций - IIS)

Если вы хотите просто отключить кеширование для веб-сайта или приложения:

  • перейдите в Диспетчер IIS
  • Выберите желаемый сайт/приложение
  • в функциях Просмотр выберите Заголовки HTTP-ответа:
  • В панели действий нажмите: Установить общие заголовки
  • проверить Expire Web Content
  • Установить: Немедленно
  • OK

альтернативно, из командной строки:

appcmd.exe set config  "Default Web Site" -section:system.webServer/staticContent /clientCache.cacheControlMode:"DisableCache" 

Для получения подробной информации и подробностей, пожалуйста, проверьте:

https://docs.microsoft.com/en-us/iis/configuration/system.webserver/staticcontent/clientcache

Надеюсь, это то, что вы искали, приветствия.