2009-11-18 2 views
2

Архитектор моей работы недавно прочитал руководство, в котором говорится, что он использует заголовок Expires будущего будущего для ресурсов, используемых на странице, такой как JavaScript, CSS и изображения. Идея заключается в том, что вы устанавливаете заголовок Expires для этих ресурсов в будущем, чтобы они всегда кэшировались браузером, и всякий раз, когда мы меняем файл, и поэтому необходимо, чтобы браузер запрашивал ресурс снова вместо использования его кеша, измените имя файла добавив номер версии.ASP.NET: законная архитектура/HttpModule?

Вместо того чтобы включить это в наш процесс сборки, у него есть другая идея. Вместо того, чтобы менять имена файлов в источнике и на диске сервера для каждой сборки (предоставленной, это было бы утомительно), мы собираемся подделать ее. Его план состоит в том, чтобы установить, что будущее наступает по указанным ресурсам, а затем реализовать два HttpModules.

Один модуль будет перехватывать все потоки ответов на наших страницах ASPX и HTML, прежде чем они выйдут, найдите ссылки на ресурсы и примените параметр версии, который является последней измененной датой файла. Другой HttpModule будет обрабатывать все запросы на ресурсы и просто игнорировать часть версии адреса. Таким образом, браузер всегда запрашивает новый файл ресурсов каждый раз, когда он менялся на диске, и при этом никогда не было необходимости изменять имя файла на диске.

Имеют смысл?

Моя проблема связана с модулем, который перезаписывает поток ответа ASPX/HTML-страницы. Он просто собирается применить кучу Regex.Replace() в атрибутах «src» из <script> и <img> тегов и атрибут «href» в тегах <link>. Это будет происходить для каждого отдельного запроса на сервере с типом контента «text/html». Потенциально сотни или тысячи в минуту.

Я понимаю, что HttpModules подключены к конвейеру IIS, но это вынуждает добавлять чрезмерную задержку в то время, когда IIS отправляет HTTP-ответы. Нет? Как вы думаете?

+0

Я думаю, что алгоритмы будут одинаковыми, если вы это сделаете в процессе сборки (на самом деле процесс публикации будет лучше), единственное отличие состоит в том, что вы просто выполняете операции один раз, а не по каждому запросу. –

ответ

0

Он беспокоится о том, что на клиент не кэшируется - очевидно, это зависит от того, как настроено настроение пользователей в браузере; если это конфигурация по умолчанию, то я сомневаюсь, что вам нужно будет беспокоиться о том, чтобы попытаться догадаться о кешировании клиентов, это слишком сложно, и результаты не гарантируются, а также не помогут новым пользователям.

Что касается модулей HTTP, я бы сказал, что они в порядке, но вы хотите, чтобы они были ослепительно быстрыми и эффективными, если вы берете этот трек; это, вероятно, стоит попробовать. Я не могу говорить о целесообразности использования RegEx, чтобы делать то, что вы хотите сделать внутри.

Если вы ищете высокую производительность, я предлагаю вам (или вашему архитектору) сделать некоторое чтение (и я не имею в виду это неприятным образом). Я недавно узнал что-то, что, как мне кажется, поможет - объясните мне (и, возможно, вы это уже знаете об этом).

Браузеры одновременно содержат ограниченное количество одновременных подключений, открытых для определенного имени хоста в любой момент времени. например, IE6 будет выполнять только 6 подключений, чтобы сказать www.foo.net.

Если вы позвоните своим образам, скажем images.foo.net, вы сразу получите 6 новых соединений. Идея состоит в том, чтобы разделить различные типы контента на разные имена хостов (css.foo.net, scripts.foo.net, ajaxcalls.foo.net) таким образом, чтобы убедиться, что браузер действительно работает от вашего имени.

+0

Различные трюки хостов также можно найти в том же Руководстве по лучшей практике Yahoo !, что исходный плакат связан, fyi! – Funka

1

Несколько вещей, чтобы быть в курсе:

  1. Если идея состоит в том, чтобы добавить строку запроса в статических имена файлов, чтобы указать их версию, к сожалению, также предотвратит кэширование драйвера HTTP режима ядра (http.sys)
  2. Сканирование каждого ответа на основе регулярных выражений будет медленным, медленным, медленным. Это также, вероятно, будет ненадежным, с трудно прогнозируемыми угловыми случаями.

Несколько альтернатив:

  1. Используйте управляющие адаптерами явно заменять определенные URL-адрес или путь с текущей версией. Это позволяет вам сосредоточиться на изображениях, CSS и т. Д.
  2. Изменение имен папок вместо имен файлов при использовании статических файлов
  3. Рассмотрите возможность использования скинов ASP.NET для централизации имен файлов. Это поможет упростить обслуживание.

В случае, если это полезно, я освещаю эту тему в своей книге (Ultra-Fast ASP.NET), включая примеры кода.

0

http://code.google.com/p/talifun-web

StaticFileHandler - Подавать статические файлы в кэшируемы, возобновляемое образом. CrusherModule - Подавать сжатые версии JS и CSS с возможностью кэширования.

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

Уменьшение количества обслуживаемых файлов, вероятно, является одним из лучших способов повысить скорость вашего веб-сайта. CrusherModule объединяет все css на вашем сайте в один файл и все js в другой файл.

Память дешевая, жесткие диски медленные, поэтому используйте ее!

 Смежные вопросы

  • Нет связанных вопросов^_^