IIS и статический контент?
Согласно Ultra-Fast ASP.NET: Глава 3 - Кэширование:
Файлы, которые браузер извлекает с сервера, должны храниться в кэше браузера как можно дольше, чтобы минимизировать количество обращений к серверу.
Но как IIS знает, что такое статический контент, а какой нет?
Это просто изображения, CSS, JS, а не ASPX, ashx...?
Где в IIS можно увидеть, что уже считается статичным, а что нет?
Как насчет сценария, когда страница была объявлена с
<%@ OutputCache
заголовок (безlocation
)? Являются лиimages
,CSS
а такжеJS
исходные файлы внутри него также выводятся в кеш с такими же свойствами?Как лучшая практика, я должен установить один год в будущем как максимальное время истечения. Я должен использовать это по умолчанию для всего статического контента на сайте
Итак, я сделал это:
Но позже, после нажатия 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 сейчас. Поэтому, пожалуйста, оставьте комментарий, если вы можете убедиться, что это местоположение точно!
- Статический контент - это тот, который IIS считывает и отправляет в браузер без какой-либо обработки. Там вы можете настроить IIS, чтобы включить некоторые
Cache-Control Header
кэшировать его на клиентских компьютерах браузера. - Вы можете сделать этот эфир с помощью прямой настройки IIS, эфир с помощью команд на
web.config
как ты говоришь. Команды, которые вы добавляете в web.config и относящиеся к IIS, не имели ничего общего с asp.net, но IIS и IIS сохраняют его конфигурацию в другом файле, поэтому при изменении этих заголовков управления кэшем непосредственно IIS вы их не видите на web.config. - Теперь для статического контента, такого как изображения, CSS, JavaScript и другие подобные файлы, говорят, что вы можете следовать политике "никогда не истекает", добавляя 10 лет истечения.
- Проблема здесь в том, что если вы не можете изменить содержимое статического файла, например, если вы кешируете файл javascript с 10-летним сроком действия и вносите в него небольшие изменения, то вам нужен ether, чтобы изменить имя файла, ether на добавить какой-то параметр в конце.
- Теперь
<%@ OutputCache
элемент управления относится к кэш-памяти сервера, а не к клиенту, и на самом деле выполняется кэширование рендеринга элемента управления на сервере, поэтому в следующий раз, когда вы попросите его не терять время на его повторное рендеринг, а прочитать его из кеш - все равно отправляем в браузер.
И вы можете также прочитать этот ответ еще для некоторых: В чем разница между кешем IIS (динамический и статический),OutPutCache и кеш браузера