Поделиться через


Перевод веб-приложений в автономный режим с помощью веб-развертывания

Джейсон Ли

В этом разделе описывается, как перевести веб-приложение в автономный режим на время автоматического развертывания с помощью средства веб-развертывания служб 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 в проект веб-приложения

  1. Откройте решение в Visual Studio 2010.

  2. В окне Обозреватель решений щелкните правой кнопкой мыши проект веб-приложения, наведите указатель на пункт Добавить и выберите пункт Создать элемент.

  3. В диалоговом окне Добавление нового элемента выберите HTML-страница.

  4. В поле Имя введите App_offline-template.htmи нажмите кнопку Добавить.

    В поле Имя введите App_offline-template.htm и нажмите кнопку Добавить.

  5. Добавьте простой HTML-код, чтобы сообщить пользователям, что приложение недоступно, а затем сохраните файл. Не включайте теги на стороне сервера (например, теги с префиксом "asp:").

    Добавьте простые H T M L, чтобы сообщить пользователям, что приложение недоступно, а затем сохраните файл.

  6. В окне Обозреватель решений щелкните правой кнопкой мыши новый файл и выберите пункт Свойства.

  7. В окне Свойства в строке Действие сборки выберите Нет.

    В окно свойств в строке Действие сборки выберите Нет.

Развертывание и удаление файла 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

  1. В Visual Studio 2010 откройте файл проекта MSBuild, который управляет процессом развертывания. В примере решения Диспетчера контактов это файл Publish.proj .

  2. В корневом элементе Project создайте новый элемент PropertyGroup для хранения переменных для развертывания App_offline :

    <PropertyGroup>
      <AppOfflineTemplateFilename   
        Condition=" '$(AppOfflineTemplateFilename)'=='' ">
          app_offline-template.htm
      </AppOfflineTemplateFilename>
      <AppOfflineSourcePath 
        Condition=" '$(AppOfflineSourcePath)'==''">
          $(SourceRoot)ContactManager.Mvc\$(AppOfflineTemplateFilename)
      </AppOfflineSourcePath>
    </PropertyGroup>
    
  3. Свойство SourceRoot определено в другом месте файла Publish.proj . Он указывает расположение корневой папки для исходного содержимого относительно текущего пути, другими словами, относительно расположения файла Publish.proj .

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

  5. Добавьте новый элемент Targetс именем GetAppOfflineAbsolutePath. В этом целевом объекте используйте задачу ConvertToAbsolutePath , чтобы получить абсолютный путь к файлу шаблона App_offline в папке проекта.

    <Target Name="GetAppOfflineAbsolutePath" BeforeTargets="DeployAppOffline">
      <ConvertToAbsolutePath Paths="$(AppOfflineSourcePath)">
        <Output TaskParameter="AbsolutePaths"       
                PropertyName="AppOfflineAbsoluteSourcePath" />
      </ConvertToAbsolutePath>
    </Target>
    
  6. Этот целевой объект принимает относительный путь к файлу шаблона App_offline в папке проекта и сохраняет его в новом свойстве как абсолютный путь к файлу. Атрибут BeforeTargets указывает, что этот целевой объект будет выполняться перед целевым объектом DeployAppOffline , который вы создадите на следующем шаге.

  7. Добавьте новый целевой объект 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>
    
  8. В этом примере свойство ContactManagerIisPath определяется в другом месте файла проекта. Это просто путь к приложению IIS в формате [имя веб-сайта IIS]/[имя приложения]. Включение условия в целевой объект позволяет пользователям переключать развертывание App_offline , изменяя значение свойства или предоставляя параметр командной строки.

  9. Добавьте новый целевой объект с именем 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>
    
  10. Последняя задача — вызвать эти новые целевые объекты в соответствующих точках во время выполнения файла проекта. Это можно сделать разными способами. Например, в файле Publish.proj свойство FullPublishDependsOn указывает список целевых объектов, которые должны выполняться по порядку при вызове целевого объекта FullPublish по умолчанию.

  11. Измените файл проекта 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 для создания списка файлов, которые должны быть включены в пакет веб-развертывания. Вы можете настроить содержимое веб-пакетов, добавив собственные элементы в этот список. Для этого необходимо выполнить следующие общие действия:

  1. Создайте пользовательский файл проекта с именем [имя проекта].wpp.targets в той же папке, что и файл проекта.

    Примечание

    Файл WPP.targets должен идти в той же папке, что и файл проекта веб-приложения, например ContactManager.Mvc.csproj, а не в той же папке, что и любые пользовательские файлы проекта, используемые для управления процессом сборки и развертывания.

  2. В файле WPP.targets создайте новый целевой объект MSBuild, который выполняется перед целевым объектом CopyAllFilesToSingleFolderForPackage . Это целевой объект WPP, который создает список вещей для включения в пакет.

  3. В новом целевом объекте создайте элемент ItemGroup .

  4. В элементе 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 в пакет веб-развертывания

  1. Откройте решение в Visual Studio 2010.

  2. В окне Обозреватель решений щелкните правой кнопкой мыши узел проекта веб-приложения (например, ContactManager.Mvc), наведите указатель на пункт Добавить, а затем выберите пункт Создать элемент.

  3. В диалоговом окне Добавление нового элемента выберите шаблон XML-файл .

  4. В поле Имя введите [имя проекта].wpp.targets (например, ContactManager.Mvc.wpp.targets) и нажмите кнопку Добавить.

    В поле Имя введите имя проекта .wpp.targets, а затем нажмите кнопку Добавить.

    Примечание

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

  5. Добавьте в файл описанную выше разметку 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>
    
  6. Сохраните и закройте файл [имя проекта].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, описанный в этих руководствах, вам потребуется использовать несколько другой подход, чтобы перевести приложение в автономный режим во время процесса публикации.