Предварительная компиляция веб-сайта (C#)

Скотт Митчелл

Visual Studio предлагает ASP.NET разработчикам два типа проектов: проекты веб-приложений (WAP) и проекты веб-сайтов (WSP). Одно из ключевых различий между двумя типами проектов заключается в том, что веб-приложения должны явно скомпилировать код перед развертыванием, в то время как код в WSP может быть автоматически скомпилирован на веб-сервере. Однако можно предварительно скомпилировать WSP перед развертыванием. В этом руководстве рассматриваются преимущества предварительной компиляции и показано, как выполнить предварительную компиляцию веб-сайта из Visual Studio и из командной строки.

Введение

Visual Studio предлагает ASP.NET разработчикам два разных типа проектов: проекты веб-приложений (WAP) и проекты веб-сайтов (WSP). Одно из ключевых различий между этими типами проектов заключается в том, что wap требуют явной компиляции , в то время как WSP используют автоматическую компиляцию по умолчанию. С помощью WAP код веб-приложения компилируется в одну сборку, которая создается в папке Bin веб-сайта. Развертывание влечет за собой копирование содержимого разметки ( .aspx.ascxфайлы , и .master ) в проект вместе со сборкой в папке Bin ; сами файлы класса программной части развертывать не нужно. С другой стороны, вы развертываете WSP, копируя страницы разметки и соответствующие классы кода программной части в рабочую среду. Классы кода программной части компилируются на веб-сервере по запросу.

Примечание

Дополнительные сведения о различиях между моделями проекта, явной и автоматической компиляцией, а также о том, как модель компиляции влияет на развертывание, см. в разделе "Явная компиляция и автоматическая компиляция" в учебнике Определение файлов, которые необходимо развернуть.

Параметр автоматической компиляции прост в использовании. Нет явного этапа компиляции, и необходимо развернуть только измененные файлы, тогда как явная компиляция требует развертывания измененных страниц разметки и только что скомпилированной сборки. Однако автоматическое развертывание имеет два потенциальных недостатка:

  • Так как страницы должны автоматически компилироваться при первом посещении, может возникнуть небольшая, но заметная задержка при первом запросе ASP.NET страницы после развертывания.
  • Автоматическая компиляция требует наличия декларативной разметки и исходного кода на веб-сервере. Это может быть непривлекательным вариантом, если вы планируете продавать веб-приложение клиентам, которые установят его на своих веб-серверах.

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

Общие сведения о создании и компиляции кода ASP.NET

Прежде чем мы рассмотрим доступные параметры предварительной компиляции, давайте поговорим о создании и компиляции кода, которые происходят при первом запросе страницы ASP.NET с момента ее создания или последнего обновления. Как известно, ASP.NET страницы состоят из двух частей: декларативной разметки в .aspx файле и части исходного кода, обычно в отдельном файле класса программной части (.aspx.cs). Действия, выполняемые средой выполнения при запросе страницы ASP.NET, зависят от модели компиляции приложения.

При использовании wap исходный код страниц должен быть явно скомпилирован в одну сборку перед развертыванием. Во время развертывания эта сборка и различные страницы разметки копируются в рабочую среду. Когда на веб-сервер поступает запрос для ASP.NET страницы, среда выполнения создает экземпляр класса кода программной части страницы и вызывает его ProcessRequest метод, который запускает жизненный цикл страницы и, в конечном счете, создает содержимое страницы, которое возвращается инициатору запроса. Среда выполнения может работать с классом кода программной части страницы ASP.NET, так как класс кода программной части уже был скомпилирован в сборку до развертывания.

При использовании WSP и автоматической компиляции перед развертыванием не выполняется явный шаг компиляции. Вместо этого развертывание включает копирование декларативного и исходного содержимого кода в рабочую среду. Когда запрос поступает на веб-сервер для ASP.NET страницы в первый раз с момента создания или последнего обновления страницы, среда выполнения должна сначала скомпилировать класс кода программной части в сборку. Эта скомпилированная сборка сохраняется в папке %WINDIR%\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files, хотя расположение этой папки можно настроить с помощью <compilation tempDirectory="" /> элемента <system.web>, обычно в Web.config. Так как сборка сохраняется на диск, ее не нужно перекомпилировать при последующих запросах к той же странице.

Примечание

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

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

Но как насчет декларативной части ASP.NET страниц ( .aspx файл)? Очевидно, что между .aspx файлами и кодом в их классах кода программной части существует связь, так как веб-элементы управления, определенные в декларативной разметке, доступны в коде. Также очевидно, что содержимое в файлах .aspx сильно влияет на отрисованную разметку, созданную страницей. Итак, как среда выполнения работает с синтаксисом текстового, HTML-кода и веб-элемента управления, определенным в .aspx файле, для создания отображаемого содержимого запрошенной страницы?

Я не хочу слишком отвлекаться на низкоуровневые сведения о реализации, которые различаются между WAP и WSP, но в двух словах среда выполнения автоматически создает файл класса, содержащий различные веб-элементы управления в качестве защищенных членов и методов. Созданный файл реализуется как разделяемый класс соответствующего класса кода программной части. (Разделяемые классы позволяют распределять содержимое одного класса между несколькими файлами.) Таким образом, класс кода программной части определяется в двух местах: в созданном .aspx.cs файле и в этом автоматически созданном классе, созданном средой выполнения. Этот автоматически созданный класс хранится в папке %WINDIR%\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files .

Важно отметить, что для отрисовки ASP.NET страницы средой выполнения ее декларативная и части исходного кода должны быть скомпилированы в сборку. При использовании wap исходный код явно компилируется в сборку перед развертыванием, но декларативная разметка по-прежнему должна быть преобразована в код и скомпилирована средой выполнения на веб-сервере. При использовании WSP с автоматической компиляцией исходный код и декларативная разметка должны компилироваться веб-сервером.

Можно использовать явную компиляцию с моделью WSP. Вы можете явно скомпилировать часть исходного кода, как в модели WAP. Более того, можно также скомпилировать декларативную разметку.

Параметры предварительной компиляции

Платформа .NET Framework поставляется со средством компиляции ASP.NET (aspnet_compiler.exe), которое позволяет компилировать исходный код (и даже содержимое) приложения ASP.NET, созданного с помощью модели WSP. Это средство было выпущено с платформа .NET Framework версии 2.0 и находится в %WINDIR%\Microsoft.NET\Framework\v2.0.50727 папке. Его можно использовать из командной строки или запустить из Visual Studio с помощью параметра Опубликовать веб-сайт в меню Сборка.

Средство компиляции предоставляет две общие формы компиляции: предварительная компиляция на месте и предварительная компиляция для развертывания. С помощью предварительной компиляции на месте вы запускаете aspnet_compiler.exe средство из командной строки и указываете путь к виртуальному каталогу или физическому пути веб-сайта, который находится на вашем компьютере. Затем средство компиляции компилирует каждую ASP.NET страницу в проекте, сохраняя скомпилированную версию в %WINDIR%\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files папке так же, как если бы страницы были впервые посещены из браузера. Предварительная компиляция на месте может ускорить первый запрос, сделанный к недавно развернутым ASP.NET страницам на сайте, так как это избавляет среду выполнения от необходимости выполнять этот шаг. Однако предварительная компиляция на месте не полезна для большинства размещенных веб-сайтов, так как для нее требуется возможность запуска программ из командной строки веб-сервера. В общих средах размещения такой уровень доступа запрещен.

Примечание

Дополнительные сведения о предварительной компиляции на месте см. в статье Практическое руководство. Предварительная компиляция ASP.NET веб-сайтов и предварительная компиляция в ASP.NET 2.0.

Вместо компиляции страниц веб-сайта в папку Temporary ASP.NET Files предварительная компиляция для развертывания компилирует страницы в каталог по вашему выбору и в формате, который можно развернуть в рабочей среде.

В этом руководстве мы рассмотрим два варианта предварительной компиляции для развертывания: предварительная компиляция с обновляемым пользовательским интерфейсом и предварительная компиляция с помощью не обновляемого пользовательского интерфейса. Предварительная компиляция с обновляемым пользовательским интерфейсом оставляет декларативную разметку в .aspxфайлах , .ascxи .master , что позволяет разработчику просматривать и при необходимости изменять декларативную разметку на рабочем сервере. Предварительная компиляция с не обновляемым пользовательским интерфейсом создает страницы .aspx , которые не содержат содержимого, а также удаляет .ascx файлы и .master , тем самым скрывая декларативную разметку и запрещая разработчику изменять ее в рабочей среде.

Предварительная компиляция для развертывания с обновляемым пользовательским интерфейсом

Лучший способ понять предварительную компиляцию для развертывания — просмотреть пример в действии. Давайте предварительно скомпилируем WSP Book Reviews для развертывания с помощью обновляемого пользовательского интерфейса. Средство компиляции ASP.NET можно вызвать из меню Сборка Visual Studio или из командной строки. В этом разделе рассматривается использование средства из Visual Studio; В разделе "Предварительная компиляция из командной строки" рассматривается запуск компилятора из командной строки.

Откройте WSP рецензирования книг в Visual Studio, перейдите в меню Сборка и выберите пункт Меню Опубликовать веб-сайт. Откроется диалоговое окно Публикация веб-сайта (см . рис. 1), в котором можно указать целевое расположение, указать, является ли пользовательский интерфейс предварительно скомпилированного сайта обновляемым, а также другие параметры средства компилятора. Целевым расположением может быть удаленный веб-сервер или FTP-сервер, но пока выберите папку на жестком диске компьютера. Так как нам нужно предварительно скомпилировать сайт с обновляемым пользовательским интерфейсом, оставьте флажок "Разрешить обновлять этот предварительно скомпилированные сайты" и нажмите кнопку ОК.

Снимок экрана: диалоговое окно

Рис. 1. Средство компиляции ASP.NET предварительно компилует веб-сайт в указанное целевое расположение
(Щелкните для просмотра полноразмерного изображения)

Примечание

Параметр Опубликовать веб-сайт в меню Сборка недоступен в Visual Web Developer. Если вы используете Visual Web Developer, вам потребуется использовать версию командной строки средства компиляции ASP.NET, описанную в разделе "Предварительная компиляция из командной строки".

После предварительной компиляции веб-сайта перейдите к целевому расположению, введенном в диалоговом окне Публикация веб-сайта. Найдите время, чтобы сравнить содержимое этой папки с содержимым вашего веб-сайта. На рисунке 2 показана папка веб-сайта Book Reviews. Обратите внимание, что он содержит файлы .aspx и .aspx.cs . Кроме того, обратите внимание, что каталог Bin содержит только один файл , Elmah.dllкоторый мы добавили в предыдущем руководстве.

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

Рис. 2. Каталог проекта содержит .aspx файлы и .aspx.cs ; Bin папка включает только Elmah.dll
(Щелкните для просмотра полноразмерного изображения)

На рисунке 3 показана папка целевого расположения, содержимое которой было создано средством компиляции ASP.NET. Эта папка не содержит файлов кода программной части. Кроме того, каталог этой папки Bin содержит несколько сборок и два .compiled файла в дополнение к сборке Elmah.dll .

Снимок экрана: папка целевого расположения, содержимое которой было создано ССП A. Средство компиляции N E T.

Рис. 3. Папка целевого расположения содержит файлы для развертывания
(Щелкните для просмотра полноразмерного изображения)

В отличие от явной компиляции в WAP, предварительная компиляция для процесса развертывания не создает одну сборку для всего сайта. Вместо этого он объединяет несколько страниц в каждую сборку. Он также компилирует Global.asax файл (если он имеется) в собственную сборку, а также любые классы в папке App_Code . Файлы, в которых хранится декларативная разметка для ASP.NET веб-страниц, пользовательских элементов управления и главных страниц (.aspx, .ascxи .master файлов соответственно), копируются как есть в целевой каталог расположения. Аналогичным образом, Web.config файл копируется прямо вместе со статическими файлами, такими как изображения, css-классы и PDF-файлы. Более формальное описание того, как средство компиляции обрабатывает различные типы файлов, см. в разделе Обработка файлов во время предварительной компиляции ASP.NET.

Примечание

Вы можете указать средству компиляции создать одну сборку для каждой ASP.NET страницы, пользовательского элемента управления или главной страницы, установив флажок "Используется фиксированное именование и одностраничные сборки" в диалоговом окне Публикация веб-сайта. Компиляция каждой страницы ASP.NET в собственную сборку обеспечивает более точный контроль над развертыванием. Например, если вы обновили одну веб-страницу ASP.NET и хотите развернуть это изменение, необходимо развернуть только файл этой страницы .aspx и связанную сборку в рабочей среде. Дополнительные сведения см. в статье Практическое руководство. Создание фиксированных имен с помощью средства компиляции ASP.NET .

Каталог целевого расположения также содержит файл, который не был частью предварительно скомпилированного веб-проекта, а именно PrecompiledApp.config. Этот файл сообщает среде выполнения ASP.NET о том, что приложение было предварительно скомпилировано и было ли оно предварительно скомпилировано с обновляемым или не обновляемым пользовательским интерфейсом.

Наконец, откройте один из файлов в целевом .aspx расположении с помощью Visual Studio или выбранного текстового редактора. При предварительной компиляции для развертывания с обновляемым пользовательским интерфейсом страницы ASP.NET в целевом каталоге расположения содержат ту же разметку, что и соответствующие файлы на веб-сайте.

Предварительная компиляция для развертывания с помощью не обновляемого пользовательского интерфейса

Средство компилятора ASP.NET также можно использовать для предварительной компиляции сайта для развертывания с помощью не обновляемого пользовательского интерфейса. Предварительная компиляция сайта с не обновляемым пользовательским интерфейсом работает так же, как предварительная компиляция с обновляемым пользовательским интерфейсом. Основное отличие заключается в том, что ASP.NET страницы, пользовательские элементы управления и главные страницы в целевом каталоге лишены разметки. Чтобы предварительно выполнить компиляцию веб-сайта для развертывания с не обновляемым пользовательским интерфейсом, выберите параметр Опубликовать веб-сайт в меню Сборка, но снимите флажок "Разрешить обновление этого предварительно скомпилированного сайта" (см . рис. 4).

Снимок экрана: параметр

Рис. 4. Снимите флажок "Разрешить обновление этого предварительно скомпилированного сайта" для предварительной компиляции с помощью не обновляемого пользовательского интерфейса
(Щелкните для просмотра полноразмерного изображения)

На рисунке 5 показана целевая папка расположения после предварительной компиляции с не обновляемым пользовательским интерфейсом.

Снимок экрана: папка целевого расположения после предварительной компиляции с не обновляемым пользовательским интерфейсом.

Рис. 5. Папка целевого расположения для развертывания с не обновляемым пользовательским интерфейсом
(Щелкните для просмотра полноразмерного изображения)

Сравните рисунок 3 с рисунком 5. Хотя две папки могут выглядеть одинаково, обратите внимание, что в не обновляемой папке пользовательского интерфейса отсутствует эталонная страница , Site.master. И хотя на рисунке 5 содержатся различные страницы ASP.NET, при просмотре содержимого этих файлов вы увидите, что они были лишены декларативной разметки и заменены замещающим текстом: "Это файл маркера, созданный средством предварительной компиляции, и его не следует удалять!"

Снимок экрана: A S P . N E T-файлов, которые удалены из декларативной разметки и заменены текстом заполнителя.

Рис. 5. Декларативная разметка удалена со страниц ASP.NET

Папки Bin на рис. 3 и 5 отличаются более существенно. Помимо сборок, Bin папка на рис. 5 содержит файл для каждой .compiled ASP.NET страницы, пользовательского элемента управления и главной страницы.

Предварительная компиляция сайта с не обновляемым пользовательским интерфейсом полезна в ситуациях, когда вы не хотите, чтобы содержимое страниц ASP.NET изменялось пользователем или компанией, которые устанавливают веб-сайт или управляют им в рабочей среде. Если вы создаете веб-приложение ASP.NET, которое вы продаете клиентам для установки на их собственных веб-серверах, вы можете убедиться, что они не изменяют внешний вид вашего сайта, напрямую изменяя .aspx поставляемые страницы. Предварительно компилируя веб-сайт с не обновляемым пользовательским интерфейсом, вы отправляете страницы заполнителей .aspx в процессе установки, тем самым не позволяя клиентам изучать или изменять свое содержимое.

Предварительная компиляция из командной строки

В фоновом режиме диалоговое окно Публикация веб-сайта Visual Studio вызывает средство компиляции ASP.NET (aspnet_compiler.exe) для предварительной компиляции веб-сайта. Кроме того, можно вызвать это средство из командной строки. На самом деле, если вы используете Visual Web Developer, вам потребуется запустить средство компилятора из командной строки, так как меню Сборка Visual Web Developer не включает параметр Опубликовать веб-сайт.

Чтобы использовать средство компилятора из командной строки, сначала перейдите в командную строку и перейдите в каталог платформы %WINDIR%\Microsoft.NET\Framework\v2.0.50727. Затем введите следующую инструкцию в командной строке:

aspnet_compiler -p "physical_path_to_app" -v / -f -u "target_location_folder"

Приведенная выше команда запускает средство компилятора ASP.NET (aspnet_compiler.exe) и с помощью -p параметра указывает ему предварительно компилировать веб-сайт, корневой physical_path_to_app; это значение будет иметь примерно такой вид, как C:\MySites\BookReviewsи должно быть разделено кавычками.

Параметр -v указывает виртуальный каталог сайта. Если ваш сайт зарегистрирован как веб-сайт по умолчанию в метабазе IIS, можно опустить -p параметр и просто указать виртуальный каталог приложения. Если вы используете -p параметр, значение, продолжающееся -v по параметру, указывает корень веб-сайта и используется для разрешения ссылок на корень приложения. Например, если указать значение , -v /MySite ссылки в приложении будут ~/path/file разрешаться как ~/MySite/path/file. Так как сайт обзоров книг находится в корневом каталоге в моей компании по размещению веб-сайтов, я использовал переключатель -v /.

Параметр -f , если он имеется, указывает средству компиляции перезаписать каталог target_location_folder , если он уже существует. Если параметр не -f указан, а папка целевого расположения уже существует, средство компиляции завершит работу с ошибкой : "ошибка ASPRUNTIME: целевой каталог не пуст. Удалите его вручную или выберите другой целевой объект".

Параметр -u , если он присутствует, сообщает средству о создании обновляемого пользовательского интерфейса. Пропустите этот параметр, чтобы предварительно компилировать сайт с не обновляемым пользовательским интерфейсом.

Наконец, target_location_folder — это физический путь к целевому каталогу расположения; Это значение будет похоже C:\MySites\Output\BookReviewsна , и должно быть разделено кавычками.

Развертывание предварительно скомпилированного веб-сайта

На этом этапе мы увидели, как использовать средство компиляции ASP.NET для предварительной компиляции веб-сайта с помощью обновляемых и не обновляемых параметров пользовательского интерфейса. Однако в наших примерах на данный момент веб-сайт предварительно скомпилирован в локальную папку, а не в рабочую среду. Хорошая новость заключается в том, что развертывание предварительно скомпилированного веб-сайта является простой и может быть выполнено через Visual Studio или с помощью другого механизма копирования файлов, например из автономного FTP-клиента.

Диалоговое окно Публикация веб-сайта (впервые показанное на рис. 1) имеет параметр целевого расположения, который указывает, куда копируются предварительно скомпилированные файлы веб-сайта. Это может быть удаленный веб-сервер или FTP-сервер. Ввод удаленного сервера в это текстовое поле выполняет предварительную компиляцию и развертывание веб-сайта на указанном сервере за один шаг. Кроме того, можно предварительно скомпилировать веб-сайт в локальную папку, а затем вручную скопировать содержимое этой папки в рабочую среду с помощью FTP или другого подхода.

Автоматическое развертывание предварительно скомпилированного веб-сайта с помощью диалогового окна "Публикация веб-сайта" в Visual Studio полезно для простых сайтов, где нет различий в конфигурации между средами разработки и рабочей среды. Однако, как указано в руководстве По общим различиям конфигурации между разработкой и рабочей средой, такие различия не редко встречаются. Например, веб-приложение Book Reviews использует в рабочей среде другую базу данных, чем в среде разработки. Когда Visual Studio публикует веб-сайт на удаленном сервере, он слепо копирует сведения о файле конфигурации в среде разработки.

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

Дополнительные сведения о копировании файлов из среды разработки в рабочую среду см. в руководствах Развертывание веб-сайта с помощью FTP-клиента и Развертывание веб-сайта с помощью Visual Studio .

Сводка

ASP.NET поддерживает два режима компиляции: автоматический и явный. Как обсуждалось в предыдущих руководствах, проекты веб-приложений (WAP) используют явную компиляцию, тогда как проекты веб-сайтов (WSP) используют автоматическую компиляцию по умолчанию. Однако можно явно скомпилировать WSP перед развертыванием с помощью средства компиляции ASP.NET.

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

Счастливого программирования!

Дополнительные материалы

Дополнительные сведения о темах, рассмотренных в этом руководстве, см. в следующих ресурсах: