Используя 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 / раскраска / и т.д.) поставило меня в тупик.
Идеальное решение будет соответствовать следующим требованиям:
- VS IDE обеспечивает IntelliSense и окрашивание кода в JS / CSS. Отказ от intellisense с кодом сервера - это нормально, поскольку в этих файлах код сервера обычно прост.
- «перейти к определению» все еще работает для классов CSS (как и в статических файлах CSS)
- отправлять заголовки кэширования HTTP, в зависимости от даты изменения базового файла.
- поддерживает сжатие HTTP, как и другие статические файлы
- поддержка <% =%> и кодовых блоков
- URL-пути (по крайней мере, те, которые видят клиенты HTTP) заканчиваются на .JS или .CSS (не на .ASPX). При желании я могу использовать querystring или PathInfo для параметризации (например, выбор локали), хотя в большинстве случаев я буду использовать для этого vdirs. Кэширование должно варьироваться для разных строк запросов.
Пока лучшее (хакерское) решение, которое я придумал, это:
- Переключите базовые файлы CSS или JS на файлы .ASPX (например, foo.css.aspx или foo.js.aspx). Вставьте базовый статический контент в элемент STYLE (для CSS) или элемент SCRIPT (для JS). Это включает в себя IntelliSense JS / CSS, а также позволяет встроенные или runat = блоки кода сервера.
- Напишите HttpHandler, который:
- просматривает URL-адрес и добавляет .aspx, чтобы узнать, какой правильный ASPX используется для вызова
- использует System.Net.HttpWebRequest для вызова этого URL
- удаляет содержащиеся теги STYLE или SCRIPT, оставляя только CSS или JS
- добавляет соответствующие заголовки (кеширование, тип контента и т. Д.)
- сжимает ответ, если клиент поддерживает сжатие
- Отобразить * .CSS и * .JS на мой обработчик.
- (если IIS6) Убедитесь, что расширения файлов .JS и .CSS сопоставлены с ASP.NET
Я уже использую модифицированную версию модуля HttpCompression Darick_c , которая обрабатывает почти все вышеперечисленное для меня, поэтому модификация его для поддержки вышеуказанного решения не будет слишком сложной.
Но мое решение хакерское. Мне было интересно, если у кого-то есть более легкий подход к этой проблеме, который не теряет совершенство Visual Studio в статических файлах.
Я знаю, что могу также взломать решение только на стороне клиента, где я разделю все JS и CSS на «изменяемые» и «не изменяющиеся» файлы, но есть издержки на производительность и обслуживание для такого решения, которое Я хотел бы избежать. Мне действительно нужно решение на стороне сервера, чтобы я мог поддерживать один файл на сервере, а не файлы N + 1.
Я еще не пробовал VS10 / .NET 4.0, но я открыт для решения Dev10 / .net4, если это лучший способ заставить этот сценарий работать.
Спасибо!