Используя VS2008 и ASP.NET 3.5 (или VS 2010 / .NET 4.0?), Как я могу включить немного динамического серверного кода ASP.NET в в основном статические файлы JavaScript и CSS?
Я хочу сделать это, чтобы избежать клонирования целых файлов JS или CSS для изменения лишь небольшой части из мультитенантных сайтов. Позже я хочу расширить решение для обработки локализации внутри javascript / CSS, поддержки динамической отладки / трассировки и других интересных вещей, которые вы можете получить, динамически вводя данные в JavaScript и CSS.
Сложность в том, что я не хочу терять все крутые вещи, которые вы получаете со статическими файлами, например:
- Раскраска кода JS / CSS и intellisense
- Поддержка CSS-класса "перейти к определению" в IDE
- автоматические заголовки кэширования HTTP на основе даты базового файла
- автоматическое сжатие IIS
Качество статических файлов на стороне сервера (например, заголовки / сжатие) можно подделать с помощью HttpHandler, но сохранение качества IDE (intellisense / color / etc) поставило меня в тупик.
Идеальное решение отвечало бы следующим требованиям:
- VS IDE обеспечивает интеллект JS / CSS и раскраску кода. Отказаться от intellisense с серверным кодом - это нормально, поскольку серверный код обычно прост в этих файлах.
- "перейти к определению" по-прежнему работает для классов CSS (как и в статических файлах CSS)
- отправлять заголовки кэширования HTTP, которые зависят от даты изменения базового файла.
- поддержка сжатия HTTP, как и другие статические файлы
- поддержка ‹% =%› и ‹script runat = server› блоки кода
- Пути URL (по крайней мере те, которые видят HTTP-клиенты) заканчиваются на .JS или .CSS (не .ASPX). При желании я могу использовать строку запроса или PathInfo для параметризации (например, выбора языкового стандарта), хотя в большинстве случаев я буду использовать для этого vdirs. Кеширование должно отличаться для разных строк запроса.
Пока что лучшее (хакерское) решение, которое я придумал, таково:
- Переключите базовые файлы CSS или JS на файлы .ASPX (например, foo.css.aspx или foo.js.aspx). Встраивайте базовое статическое содержимое в элемент STYLE (для CSS) или элемент SCRIPT (для JS). Это позволяет использовать intellisense JS / CSS, а также разрешать встроенные блоки кода или блоки кода runat = server.
- Write an HttpHandler which:
- looks at the URL and adds .aspx to know the right underlying ASPX to call
- использует System.Net.HttpWebRequest для вызова этого URL
- удаляет содержащиеся теги STYLE или SCRIPT, оставляя только CSS или JS
- добавляет соответствующие заголовки (кеширование, тип содержимого и т. д.)
- сжимает ответ, если клиент поддерживает сжатие
- Сопоставьте * .CSS и * .JS моему обработчику.
- (если IIS6) Убедитесь, что расширения файлов .JS и .CSS сопоставлены с ASP.NET.
Я уже использую модифицированную версию HttpCompression Module Darick_c, которая обрабатывает почти все из выше для меня, поэтому изменить его для поддержки решения выше не будет слишком сложно.
Но мое решение взломано. Мне было интересно, есть ли у кого-нибудь более легкий подход к этой проблеме, который не теряет достоинства статических файлов Visual Studio.
Я знаю, что могу также взломать решение только на стороне клиента, в котором я разделю все JS и CSS на файлы «разные» и «не будут меняться», но для такого решения есть накладные расходы на производительность и обслуживание, которые я бы хотелось бы избежать. Мне действительно нужно решение на стороне сервера, чтобы я мог поддерживать на сервере один файл, а не N + 1 файлы.
Я еще не пробовал VS10 / .NET 4.0, но я открыт для решения Dev10 / .net4, если это лучший способ заставить этот сценарий работать.
Спасибо!