IIS и статический контент?

Согласно Ultra-Fast ASP.NET: Глава 3 - Кэширование:

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

  • Но как IIS знает, что такое статический контент, а какой нет?

    Это просто изображения, CSS, JS, а не ASPX, ashx...?

    Где в IIS можно увидеть, что уже считается статичным, а что нет?

  • Как насчет сценария, когда страница была объявлена ​​с <%@ OutputCache заголовок (без location)? Являются ли images, CSS а также JS исходные файлы внутри него также выводятся в кеш с такими же свойствами?

  • Как лучшая практика, я должен установить один год в будущем как максимальное время истечения. Я должен использовать это по умолчанию для всего статического контента на сайте

Итак, я сделал это:

Установить общие заголовки ответа HTTP

Но позже, после нажатия OKЯ не могу найти никакого сводного меню, которое показывает мне: кому я уже положил заголовок ответа (в данном случае: css папка).

В настоящее время, чтобы увидеть, что css папка была применена с заголовками ответа - я должен перейти к css папка снова --> Заголовок Http-ответа-->Установить общие заголовки --> и тогда я вижу это. Это не написано в web.config.

Но если я сделаю это для файла (Login.aspx например): я вижу это в web.config:

<configuration>
    <location path="Login.aspx">
        <system.webServer>
            <staticContent>
                <clientCache cacheControlMode="UseExpires" cacheControlMaxAge="1.00:00:00" httpExpires="Fri, 15 Feb 2013 00:00:00 GMT" />
            </staticContent>
        </system.webServer>
    </location>
</configuration>

2 ответа

Решение

Я понимаю вашу ситуацию. Иногда сбивает с толку, как IIS обрабатывает файл. Он также отличается для IIS 6 по сравнению с IIS 7 и отличается для пулов классических приложений и пулов приложений в интегрированном режиме. Мой опыт в основном связан с интегрированными пулами приложений в IIS 7.5, поэтому я могу наиболее точно прокомментировать эту среду.

Первый вопрос

Но как IIS знает, что на самом деле является статическим контентом, а что нет?

Это просто изображения, CSS, JS, а не ASPX, Ashx...?

Где я могу увидеть в IIS, что уже считается статичным, а что нет?

Вы можете просмотреть список обработчиков файлов в IIS, перейдя на свой веб-сайт и нажав "Сопоставления обработчиков". По умолчанию они наследуются от.Net base web.config, который находится в другом месте в зависимости от вашей версии.Net Framework.

  • C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG \ web.config
  • C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ web.config

Если запрашиваемый файл еще не был явно отображен на другой обработчик, он попадает в обработчик catch all (*) как последний вариант (System.Web.DefaultHttpHandler), который определяет, является ли это статическим файлом или запросом на просмотр каталога. Таким образом, статические файлы - это просто файлы, уже не связанные с другим обработчиком. Например, вы увидите, что *.aspx уже сопоставлен с System.Web.UI.PageHandlerFactory до этого обработчика по умолчанию. Таким образом, он будет обработан этим обработчиком и не будет рассматриваться как статический файл. Если вы удалите это отображение, вы можете технически использовать *.aspx как статический файл, если вы действительно этого хотите (просто для доказательства того, как он работает).

Но вы также можете явно указать тип файла как статический файл, добавив запись в раздел httpHandlers вашего web.config, отображающую расширения файла в System.Web.StaticFileHandler в IIS. Например:

<configuration>
  <system.webServer>
    <handlers>
      <add name="StaticHandler" verb="*" path="*.zip" type="System.Web.StaticFileHandler" preCondition="integratedMode" />
    </handlers>
  </system.webServer>
</configuration>

Этот пример использует <system.webServer> раздел конфигурации, так что это для пула приложений, работающих в интегрированном режиме.

Второй вопрос

Как насчет сценария, когда страница была объявлена ​​с заголовком<% @ OutputCache (без расположения). изображения, css, js src файлы внутри него также выводятся в кеш с такими же свойствами?

Нет. Поскольку страница является сервером как отдельный запрос (может быть, даже отдельным обработчиком), она может иметь совершенно разные заголовки / подсказки кеша. Страница хоста и ресурсы, которые она может использовать, не связаны с точки зрения кэширования.

На самом деле вы можете даже хотеть иметь более короткий период кэширования для *.html и более длинный период кэширования для *.jpg или *.png? Что-то, чтобы рассмотреть.

Третий вопрос

Как лучший пример, я должен установить один год в будущем как максимальное время истечения. Я должен использовать это как значение по умолчанию для всего статического контента на сайте

Хм... Я не могу идти так далеко, как один год. Как насчет одного месяца? Я бы установил глобальную политику так:

<configuration>
  <system.webServer>
    <staticContent>
      <!-- Set expire headers to 30 days for static content-->
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>

Это так же, как образец, который вы показали выше, но не внутри <location> элемент, а не прямо в корне <configuration> элемент, так что это политика по умолчанию. Опять же, это для пула приложений, работающих в интегрированном режиме. Иногда вам также необходимо включить:

<configuration>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true">
            <!-- stuff -->
        </modules>
    </system.webServer>
<system.webServer>

Это просто гарантирует, что статические файлы обрабатываются с помощью управляемого обработчика статических файлов, который учитывает вышеуказанные элементы конфигурации.

Изменить на адрес Комментарии

Документация к диалоговому окну конфигурации, который вы разместили выше, находится здесь: настройка заголовка ответа HTTP Expires (IIS 7)

Видимо эти настройки сохраняются в C:\Windows\System32\inetsrv\config\applicationHost.config

Я не имею IIS7 и лично развиваюсь на IIS 7.5 сейчас. Поэтому, пожалуйста, оставьте комментарий, если вы можете убедиться, что это местоположение точно!

  1. Статический контент - это тот, который IIS считывает и отправляет в браузер без какой-либо обработки. Там вы можете настроить IIS, чтобы включить некоторые Cache-Control Header кэшировать его на клиентских компьютерах браузера.
  2. Вы можете сделать этот эфир с помощью прямой настройки IIS, эфир с помощью команд на web.config как ты говоришь. Команды, которые вы добавляете в web.config и относящиеся к IIS, не имели ничего общего с asp.net, но IIS и IIS сохраняют его конфигурацию в другом файле, поэтому при изменении этих заголовков управления кэшем непосредственно IIS вы их не видите на web.config.
  3. Теперь для статического контента, такого как изображения, CSS, JavaScript и другие подобные файлы, говорят, что вы можете следовать политике "никогда не истекает", добавляя 10 лет истечения.
  4. Проблема здесь в том, что если вы не можете изменить содержимое статического файла, например, если вы кешируете файл javascript с 10-летним сроком действия и вносите в него небольшие изменения, то вам нужен ether, чтобы изменить имя файла, ether на добавить какой-то параметр в конце.
  5. Теперь <%@ OutputCache элемент управления относится к кэш-памяти сервера, а не к клиенту, и на самом деле выполняется кэширование рендеринга элемента управления на сервере, поэтому в следующий раз, когда вы попросите его не терять время на его повторное рендеринг, а прочитать его из кеш - все равно отправляем в браузер.

И вы можете также прочитать этот ответ еще для некоторых: В чем разница между кешем IIS (динамический и статический),OutPutCache и кеш браузера

Другие вопросы по тегам