Перевод веб-приложений в автономный режим с помощью веб-развертывания
В этом разделе описывается, как перевести веб-приложение в автономный режим на время автоматического развертывания с помощью средства веб-развертывания служб IIS . Пользователи, которые переходят к веб-приложению, перенаправляются в файлApp_offline.htm до завершения развертывания.
Этот раздел является частью серии учебников, основанных на требованиях к развертыванию на предприятии вымышленной компании Fabrikam, Inc. В этой серии учебников используется пример решения диспетчера контактов для представления веб-приложения с реалистичным уровнем сложности, включая приложение ASP.NET MVC 3, службу Windows Communication Foundation (WCF) и проект базы данных.
Метод развертывания в основе этих учебников основан на подходе с разделением файлов проекта, описанном в разделе Основные сведения о файле проекта, в котором процесс сборки управляется двумя файлами проекта: один содержит инструкции сборки, которые применяются к каждой целевой среде, а второй содержит параметры сборки и развертывания для конкретной среды. Во время сборки файл проекта для конкретной среды объединяется с файлом проекта, не зависящим от среды, чтобы сформировать полный набор инструкций по сборке.
Обзор задачи
Во многих сценариях веб-приложение необходимо перевести в автономный режим при внесении изменений в связанные компоненты, такие как базы данных или веб-службы. Как правило, в службах IIS и ASP.NET это можно сделать, поместив файл с именемApp_offline.htm в корневую папку веб-сайта или веб-приложения IIS. Файл App_offline.htm является стандартным HTML-файлом и обычно содержит простое сообщение о том, что сайт временно недоступен из-за обслуживания. Хотя файлApp_offline.htm существует в корневой папке веб-сайта, СЛУЖБЫ IIS автоматически перенаправляют все запросы на этот файл. Завершив внесение обновлений, вы удаляете файлApp_offline.htm , и веб-сайт возобновляет обслуживание запросов, как обычно.
При использовании веб-развертывания для выполнения автоматизированного или одношагового развертывания в целевой среде может потребоваться добавить и удалить файлApp_offline.htm в процесс развертывания. Для этого необходимо выполнить следующие высокоуровневые задачи:
- В файле проекта Microsoft Build Engine (MSBuild), который используется для управления процессом развертывания, создайте целевой объект MSBuild, который копирует файлApp_offline.htm на целевой сервер перед началом каких-либо задач развертывания.
- Добавьте еще один целевой объект MSBuild, который удаляет файлApp_offline.htm с целевого сервера после завершения всех задач развертывания.
- В проекте веб-приложения создайте файл WPP.targets , который гарантирует, что файлApp_offline.htm будет добавлен в пакет развертывания при вызове веб-развертывания.
В этом разделе показано, как выполнить эти процедуры. В задачах и пошаговых руководствах в этом разделе предполагается, что вы уже создали решение, содержащее хотя бы один проект веб-приложения, и используете пользовательский файл проекта для управления процессом развертывания, как описано в разделе Веб-развертывание на предприятии. Кроме того, вы можете использовать пример решения Диспетчера контактов для выполнения примеров, приведенных в этом разделе.
Добавление файла App_Offline в проект веб-приложения
Первая задача, необходимая для выполнения, — добавить файл App_offline в проект веб-приложения:
- Чтобы предотвратить вмешательство файла в процесс разработки (вы не хотите, чтобы приложение не было постоянно в автономном режиме), следует вызвать его не так, какApp_offline.htm. Например, можно присвоить файлу имяApp_offline-template.htm.
- Чтобы предотвратить развертывание файла "как есть", присвойте действию сборки значение Нет.
Добавление файла App_offline в проект веб-приложения
Откройте решение в Visual Studio 2010.
В окне Обозреватель решений щелкните правой кнопкой мыши проект веб-приложения, наведите указатель на пункт Добавить и выберите пункт Создать элемент.
В диалоговом окне Добавление нового элемента выберите HTML-страница.
В поле Имя введите App_offline-template.htmи нажмите кнопку Добавить.
Добавьте простой HTML-код, чтобы сообщить пользователям, что приложение недоступно, а затем сохраните файл. Не включайте теги на стороне сервера (например, теги с префиксом "asp:").
В окне Обозреватель решений щелкните правой кнопкой мыши новый файл и выберите пункт Свойства.
В окне Свойства в строке Действие сборки выберите Нет.
Развертывание и удаление файла App_Offline
Следующим шагом является изменение логики развертывания, чтобы скопировать файл на целевой сервер в начале процесса развертывания и удалить его в конце.
Примечание
В следующей процедуре предполагается, что для управления процессом развертывания используется пользовательский файл проекта MSBuild, как описано в разделе Общие сведения о файле проекта. Если вы развертываете прямо из Visual Studio, вам потребуется использовать другой подход. Сайед Ибрагим Хашими описывает один из таких подходов в статье Как перевести веб-приложение в автономный режим во время публикации.
Чтобы развернуть файл App_offline на целевом веб-сайте IIS, необходимо вызвать MSDeploy.exe с помощью поставщика contentPath веб-развертывания. Поставщик contentPath поддерживает как пути к физическим каталогам, так и пути к веб-сайту IIS или приложению, что делает его идеальным выбором для синхронизации файла между папкой проекта Visual Studio и веб-приложением IIS. Чтобы развернуть файл, команда MSDeploy должна выглядеть следующим образом:
msdeploy.exe –verb:sync
-source:contentPath="[Project folder]\App_offline.template.htm"
-dest:contentPath="[IIS application path]/App_offline.htm",
computerName="[Destination web server]"
Чтобы удалить файл с целевого сайта в конце процесса развертывания, команда MSDeploy должна выглядеть следующим образом:
msdeploy.exe –verb:delete
-dest:contentPath="[IIS application path]/App_offline.htm",
computerName="[Destination web server]"
Чтобы автоматизировать эти команды в процессе сборки и развертывания, необходимо интегрировать их в пользовательский файл проекта MSBuild. В следующей процедуре описано, как это сделать.
Развертывание и удаление файла App_offline
В Visual Studio 2010 откройте файл проекта MSBuild, который управляет процессом развертывания. В примере решения Диспетчера контактов это файл Publish.proj .
В корневом элементе Project создайте новый элемент PropertyGroup для хранения переменных для развертывания App_offline :
<PropertyGroup> <AppOfflineTemplateFilename Condition=" '$(AppOfflineTemplateFilename)'=='' "> app_offline-template.htm </AppOfflineTemplateFilename> <AppOfflineSourcePath Condition=" '$(AppOfflineSourcePath)'==''"> $(SourceRoot)ContactManager.Mvc\$(AppOfflineTemplateFilename) </AppOfflineSourcePath> </PropertyGroup>
Свойство SourceRoot определено в другом месте файла Publish.proj . Он указывает расположение корневой папки для исходного содержимого относительно текущего пути, другими словами, относительно расположения файла Publish.proj .
Поставщик contentPath не принимает относительные пути к файлам, поэтому перед развертыванием необходимо получить абсолютный путь к исходному файлу. Для этого можно использовать задачу ConvertToAbsolutePath .
Добавьте новый элемент Targetс именем GetAppOfflineAbsolutePath. В этом целевом объекте используйте задачу ConvertToAbsolutePath , чтобы получить абсолютный путь к файлу шаблона App_offline в папке проекта.
<Target Name="GetAppOfflineAbsolutePath" BeforeTargets="DeployAppOffline"> <ConvertToAbsolutePath Paths="$(AppOfflineSourcePath)"> <Output TaskParameter="AbsolutePaths" PropertyName="AppOfflineAbsoluteSourcePath" /> </ConvertToAbsolutePath> </Target>
Этот целевой объект принимает относительный путь к файлу шаблона App_offline в папке проекта и сохраняет его в новом свойстве как абсолютный путь к файлу. Атрибут BeforeTargets указывает, что этот целевой объект будет выполняться перед целевым объектом DeployAppOffline , который вы создадите на следующем шаге.
Добавьте новый целевой объект DeployAppOffline. В этом целевом объекте вызовите команду MSDeploy.exe, которая развертывает файл App_offline на целевом веб-сервере.
<Target Name="DeployAppOffline" Condition=" '$(EnableAppOffline'!='false' "> <PropertyGroup> <_Cmd>"$(MSDeployPath)\msdeploy.exe" -verb:sync -source:contentPath="$(AppOfflineAbsoluteSourcePath)" -dest:contentPath="$(ContactManagerIisPath)/App_offline.htm", computerName="$(MSDeployComputerName)" </_Cmd> </PropertyGroup> <Exec Command="$(_Cmd)"/> </Target>
В этом примере свойство ContactManagerIisPath определяется в другом месте файла проекта. Это просто путь к приложению IIS в формате [имя веб-сайта IIS]/[имя приложения]. Включение условия в целевой объект позволяет пользователям переключать развертывание App_offline , изменяя значение свойства или предоставляя параметр командной строки.
Добавьте новый целевой объект с именем DeleteAppOffline. В этом целевом объекте вызовите команду MSDeploy.exe, которая удаляет файл App_offline с целевого веб-сервера.
<Target Name="DeleteAppOffline" Condition=" '$(EnableAppOffline'!='false' "> <PropertyGroup> <_Cmd>"$(MSDeployPath)\msdeploy.exe" -verb:delete -dest:contentPath="$(ContactManagerIisPath)/App_offline.htm", computerName="$(MSDeployComputerName)" </_Cmd> </PropertyGroup> <Exec Command="$(_Cmd)"/> </Target>
Последняя задача — вызвать эти новые целевые объекты в соответствующих точках во время выполнения файла проекта. Это можно сделать разными способами. Например, в файле Publish.proj свойство FullPublishDependsOn указывает список целевых объектов, которые должны выполняться по порядку при вызове целевого объекта FullPublish по умолчанию.
Измените файл проекта MSBuild для вызова целевых объектов DeployAppOffline и DeleteAppOffline в соответствующих точках процесса публикации.
<PropertyGroup> <FullPublishDependsOn> Clean; BuildProjects; DeployAppOffline; GatherPackagesForPublishing; PublishDbPackages; DeployTestDBPermissions; PublishWebPackages; DeleteAppOffline; </FullPublishDependsOn> </PropertyGroup> <Target Name="FullPublish" DependsOnTargets="$(FullPublishDependsOn)" />
При запуске пользовательского файла проекта MSBuild файл App_offline будет развернут на сервере сразу после успешной сборки. После завершения всех задач развертывания он будет удален с сервера.
Добавление файла App_Offline в пакеты развертывания
В зависимости от того, как вы настраиваете развертывание, любое существующее содержимое в целевом веб-приложении IIS, например файл App_offline.htm , может быть автоматически удалено при развертывании веб-пакета в назначении. Чтобы убедиться, что файлApp_offline.htm остается на месте в течение всего развертывания, необходимо включить файл в сам пакет веб-развертывания, а также развернуть файл непосредственно в начале процесса развертывания.
- Если вы выполнили предыдущие задачи в этом разделе, вы добавите файлApp_offline.htm в проект веб-приложения с другим именем (мы использовали App_offline-template.htm) и установите для действия сборки значение Нет. Эти изменения необходимы, чтобы файл не мешал разработке и отладке. В результате необходимо настроить процесс упаковки, чтобы убедиться, что файлApp_offline.htm включен в пакет веб-развертывания.
Конвейер веб-публикации (WPP) использует список элементов с именем FilesForPackagingFromProject для создания списка файлов, которые должны быть включены в пакет веб-развертывания. Вы можете настроить содержимое веб-пакетов, добавив собственные элементы в этот список. Для этого необходимо выполнить следующие общие действия:
Создайте пользовательский файл проекта с именем [имя проекта].wpp.targets в той же папке, что и файл проекта.
Примечание
Файл WPP.targets должен идти в той же папке, что и файл проекта веб-приложения, например ContactManager.Mvc.csproj, а не в той же папке, что и любые пользовательские файлы проекта, используемые для управления процессом сборки и развертывания.
В файле WPP.targets создайте новый целевой объект MSBuild, который выполняется перед целевым объектом CopyAllFilesToSingleFolderForPackage . Это целевой объект WPP, который создает список вещей для включения в пакет.
В новом целевом объекте создайте элемент ItemGroup .
В элементе ItemGroup добавьте элемент FilesForPackagingFromProject и укажите файлApp_offline.htm .
Файл WPP.targets должен выглядеть следующим образом:
<Project ToolsVersion="4.0"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="AddAppOfflineToPackage"
BeforeTargets="CopyAllFilesToSingleFolderForPackage">
<ItemGroup>
<FilesForPackagingFromProject Include="App_offline-template.htm">
<DestinationRelativePath>App_offline.htm</DestinationRelativePath>
</FilesForPackagingFromProject>
</ItemGroup>
</Target>
</Project>
Ниже приведены основные моменты, которые следует отметить в этом примере:
- Атрибут BeforeTargets вставляет этот целевой объект в WPP, указывая, что он должен выполняться непосредственно перед целевым объектом CopyAllFilesToSingleFolderForPackage .
- Элемент FilesForPackagingFromProject использует значение метаданных DestinationRelativePath для переименования файла из App_offline-template.htm наApp_offline.htm по мере его добавления в список.
В следующей процедуре показано, как добавить этот файл WPP.targets в проект веб-приложения.
Добавление файла WPP.targets в пакет веб-развертывания
Откройте решение в Visual Studio 2010.
В окне Обозреватель решений щелкните правой кнопкой мыши узел проекта веб-приложения (например, ContactManager.Mvc), наведите указатель на пункт Добавить, а затем выберите пункт Создать элемент.
В диалоговом окне Добавление нового элемента выберите шаблон XML-файл .
В поле Имя введите [имя проекта].wpp.targets (например, ContactManager.Mvc.wpp.targets) и нажмите кнопку Добавить.
Примечание
При добавлении нового элемента в корневой узел проекта файл создается в той же папке, что и файл проекта. Это можно проверить, открыв папку в Windows Обозреватель.
Добавьте в файл описанную выше разметку MSBuild.
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Target Name="AddAppOfflineToPackage" BeforeTargets="CopyAllFilesToSingleFolderForPackage"> <ItemGroup> <FilesForPackagingFromProject Include="App_offline-template.htm"> <DestinationRelativePath>App_offline.htm</DestinationRelativePath> </FilesForPackagingFromProject> </ItemGroup> </Target> </Project>
Сохраните и закройте файл [имя проекта].wpp.targets .
При следующей сборке и упаковке проекта веб-приложения WPP автоматически обнаружит файл WPP.targets . Файл App_offline-template.htm будет включен в результирующий пакет веб-развертывания какApp_offline.htm.
Примечание
Если развертывание завершится сбоем, файлApp_offline.htm останется на месте, а приложение останется в автономном режиме. Обычно это желательное поведение. Чтобы вернуть приложение в сеть, можно удалить файлApp_offline.htm с веб-сервера. Кроме того, если вы исправите ошибки и успешно выполните развертывание, файлApp_offline.htm будет удален.
Заключение
В этом разделе описывается, как перевести веб-приложение в автономный режим на время развертывания, опубликовав файлApp_offline.htm на целевом сервере в начале процесса развертывания и удалив его в конце. В нем также описывается, как включить файлApp_offline.htm в пакет веб-развертывания.
Дополнительные материалы
Дополнительные сведения о процессе упаковки и развертывания см. в разделах Создание и упаковка проектов веб-приложений, Настройка параметров развертывания веб-пакетов и Развертывание веб-пакетов.
Если вы публикуете веб-приложения непосредственно из Visual Studio, а не используете пользовательский подход к файлу проекта MSBuild, описанный в этих руководствах, вам потребуется использовать несколько другой подход, чтобы перевести приложение в автономный режим во время процесса публикации.