Notas del Terrible
Заметки Ужасного Зануды

Прекомпиляция в ASP.NET

января 21, 2010 21:14 by terR0Q

В ASP.NET любая страница может состоять из нескольких файлов. Можно ужать и в один, но это неудобно, в Visual Studio все разбивается на 3. Так или иначе, в них содержится программная модель (обработчики разных событий) и серверная разметка (верстка вместе с объявлениями динамических элементов, настраиваемых программно).

Когда клиент первый раз обращается к какой-то странице, происходит компиляция декларативной разметки и императивной составляющей (собственно, основной код). Хотя все. cs файлы компилируются в общую библиотеку (dll-файл проекта), для каждой страницы создается отдельная библиотека (всё это можно подробно прочитать во многих книгах и статьях). Всё хорошо, но есть одна деталь: первое обращение к любой странице занимает больше времени, чем последующие, т. к. происходит компиляция с сохранением файла в кэше ASP.NET. Это становится проблемой для крупных проектов.

Проблема решается предварительной компиляцией всего сайта. Самое простое, на мой взгляд, решение не требует каких-то дополнений среды разработки, шаманств с настройками публикации и т. п., следующее:

  1. Публикуем сайт в целевой каталог (publish в VS)
  2. В консоли набираем:
    aspnet_compiler. exe -m /LM/W3SVC/1/Root
  3. Ждём завершения и получаем откомпилированный сайт.

Теперь пара моментов. Первое: /LM/W3SVC/1/Root — это адресация сайта в иерархии IIS. Данное значение подходит для всех веб-узлов «по умолчанию», но когда на сервере много узлов, единица заменяется куда более длинным значением. Чтобы узнать точный путь нужна простая утилита — IIS Metabase Explorer. Она покажет всю иерархию узлов, в которой несложно разобраться, т. к. везде присутствуют назначенные читаемые имена узлов. Обнаружив нужный узел, надо взять его параметр MD_APP_ROOT — это и есть тот путь, который должен быть передан aspnet_compiler.

Второе: не стоит запускать компиляцию прямо в рабочем каталоге VS. Если проект активно живёт и в нём участвует сразу несколько человек, скорее всего уже за первый месяц-два там скопится много старых файлов. Если какой-то файл был удалён из проекта у одного разработчика, то у другого при обновлении он будет, скорее всего, просто исключён, а физически останется на диске. А вот когда aspnet_compiler начнёт компиляцию, он будет проходиться по всем файлам в каталоге, найдёт такой мусор и начнёт сыпать ошибки, что соответствующий класс не найден ни в одной сборке, заодно прерывая всю компиляцию (его и нет, ведь VS просто не компилирует необходимого после исключения из проекта).

Пожалуй, для счастья остается только написать скрипт для автоматической публикации и компиляции сайта, но это уже локальная проектная задача.


Комментарии

Добавить комментарий


(Отображает Gravatar)

  Country flag

biuquote
  • Комментарий
  • Предпросмотр
Loading