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

Джейсон Ли

В этом разделе описывается, как отключить веб-приложение на время автоматического развертывания с помощью средства Web Deploy служб IIS. Пользователи, которые переходят к веб-приложению, перенаправляются в файлApp_offline.htm до завершения развертывания.

Этот раздел является частью серии учебников, основанных на требованиях к развертыванию предприятия вымышленной компании Fabrikam, Inc. В этой серии учебников используется пример решения — решение Contact Manager— для представления веб-приложения с реалистичным уровнем сложности, включая приложение MVC 3 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 добавляется в пакет развертывания при вызове веб-развертывания.

В этом разделе показано, как выполнять эти процедуры. Задачи и пошаговые руководства в этом разделе предполагают, что вы уже создали решение, содержащее по крайней мере один проект веб-приложения, и что вы используете пользовательский файл проекта для управления процессом развертывания, как описано в веб-развертывании в Enterprise. Кроме того, можно использовать пример решения Contact Manager для выполнения примеров в разделе.

Добавление файла App_Offline в проект веб-приложения

Первая задача, необходимо выполнить, — добавить файл App_offline в проект веб-приложения:

  • Чтобы не дать файлу вмешиваться в процесс разработки (вы не хотите, чтобы ваше приложение было постоянно в автономном режиме), следует назвать его чем-то отличным от App_offline.htm. Например, можно назвать файл App_offline-template.htm.
  • Чтобы предотвратить развертывание файла as-is, необходимо задать для действия сборки значение None.

Добавление файла App_offline в проект веб-приложения

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

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

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

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

    В поле

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

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

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

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

    В окне

Развертывание и удаление файла App_Offline

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

Замечание

В следующей процедуре предполагается, что для управления процессом развертывания используется пользовательский файл проекта MSBuild, как описано в разделе "Общие сведения о файле проекта". Если вы развертываете прямо из Visual Studio, вам потребуется использовать другой подход. Саид Ибрагим Хашими описывает один из таких подходов в Как перевести веб-приложение в автономный режим во время публикации.

Чтобы развернуть файл App_offline на целевом веб-сайте IIS, необходимо вызвать MSDeploy.exe с помощью поставщика contentPath из Web Deploy. Поставщик 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-template в папке проекта и сохраняет его в новом свойстве в качестве абсолютного пути к файлу. Атрибут 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) и вы настроили действие сборки на None. Эти изменения необходимы для предотвращения вмешательства файла в разработку и отладку. В результате необходимо настроить процесс упаковки, чтобы убедиться, что файл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), а затем нажмите кнопку "Добавить".

    В поле

    Замечание

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

Conclusion

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

Дальнейшее чтение

Дополнительные сведения о процессе упаковки и развертывания см. в статье "Создание и упаковка проектов веб-приложений", настройка параметров для развертывания веб-пакетов и развертывание веб-пакетов.

Если вы публикуете веб-приложения непосредственно из Visual Studio, а не с помощью пользовательского подхода к файлу проекта MSBuild, описанному в этих руководствах, вам потребуется использовать немного другой подход для автономного использования приложения во время процесса публикации.