Web 配置の際、Web アプリをオフラインにする

作成者: Jason Lee

このトピックでは、インターネット インフォメーション サービス (IIS) Web 展開ツール (Web 配置) を使用した自動展開の間、Web アプリケーションをオフラインにする方法について説明します。 Web アプリケーションを参照するユーザーは、デプロイが完了するまで App_offline.htm ファイルにリダイレクトされます。

このトピックでは、Fabrikam, Inc という架空の会社のエンタープライズ展開要件に基づく一連のチュートリアルの一部を構成します。このチュートリアル シリーズでは、サンプル ソリューションである Contact Manager ソリューションを使用して、ASP.NET MVC 3 アプリケーション、Windows Communication Foundation (WCF) サービス、データベース プロジェクトなど、複雑さの現実的なレベルの Web アプリケーションを表します。

これらのチュートリアルの中心にある配置方法は、「プロジェクト ファイルの 理解」で説明されている分割プロジェクト ファイルのアプローチに基づいています。この方法では、ビルド プロセスは 2 つのプロジェクト ファイルによって制御されます。1 つは、すべての移行先環境に適用されるビルド命令を含み、1 つは環境固有のビルドと配置設定を含みます。 ビルド時に、環境固有のプロジェクト ファイルが環境に依存しないプロジェクト ファイルにマージされ、ビルド手順の完全なセットが形成されます。

タスクの概要

多くのシナリオでは、データベースや Web サービスなどの関連コンポーネントに変更を加えながら、Web アプリケーションをオフラインにする必要があります。 通常、IIS と ASP.NET では、 App_offline.htm という名前のファイルを IIS Web サイトまたは Web アプリケーションのルート フォルダーに配置することで実現します。 App_offline.htm ファイルは標準の HTML ファイルであり、通常、メンテナンスのためにサイトが一時的に使用できないことをユーザーに通知する簡単なメッセージが含まれます。 App_offline.htm ファイルは Web サイトのルート フォルダーに存在しますが、IIS は要求をファイルに自動的にリダイレクトします。 更新が完了したら、 App_offline.htm ファイルを削除すると、Web サイトは通常どおりに要求の提供を再開します。

Web 配置を使用してターゲット環境への自動またはシングルステップのデプロイを実行する場合は、 App_offline.htm ファイルの追加と削除をデプロイ プロセスに組み込むことができます。 これを行うには、次の大まかなタスクを完了する必要があります。

  • 展開プロセスの制御に使用するMicrosoft Build Engine (MSBuild) プロジェクト ファイルで、展開タスクを開始する前に、App_offline.htm ファイルをコピー先サーバーにコピーする MSBuild ターゲットを作成します。
  • すべての展開タスクが完了したときに、移行先サーバーから App_offline.htm ファイルを削除する別の MSBuild ターゲットを追加します。
  • Web アプリケーション プロジェクトで 、.wpp.targets ファイルを作成して、Web 配置の呼び出し時に App_offline.htm ファイルが配置パッケージに確実に追加されるようにします。

このトピックでは、これらの手順を実行する方法について説明します。 このトピックのタスクとチュートリアルでは、少なくとも 1 つの Web アプリケーション プロジェクトを含むソリューションが既に作成されていること、および 「エンタープライズでの Web 配置」で説明されているように、カスタム プロジェクト ファイルを使用して配置プロセスを制御していることを前提としています。 または、 Contact Manager サンプル ソリューションを使用して、トピックの例に従うことができます。

Web アプリケーション プロジェクトへのApp_Offline ファイルの追加

最初に完了する必要があるタスクは、 App_offline ファイルを Web アプリケーション プロジェクトに追加することです。

  • ファイルが開発プロセスに干渉しないようにするには (アプリケーションを完全にオフラインにしたくない場合)、 App_offline.htm以外の呼び出しを行う必要があります。 たとえば、 ファイルに という名前を App_offline-template.htmできます。
  • ファイルがそのまま展開されないようにするには、ビルド アクションを [なし] に設定する必要があります。

App_offline ファイルを Web アプリケーション プロジェクトに追加するには

  1. Visual Studio 2010 でソリューションを開きます。

  2. ソリューション エクスプローラー ウィンドウで、Web アプリケーション プロジェクトを右クリックし、[追加] をポイントして、[新しい項目] をクリックします。

  3. [ 新しい項目の追加 ] ダイアログ ボックスで、[ HTML ページ] を選択します。

  4. [ 名前 ] ボックスに「 App_offline-template.htm」と入力し、[ 追加] をクリックします。

    [名前] ボックスに「App_offline-template.htm」と入力し、[追加] をクリックします。

  5. アプリケーションが使用できないことをユーザーに通知するための簡単な HTML を追加し、ファイルを保存します。 サーバー側のタグ (たとえば、プレフィックスが "asp:") のタグは含めないでください。

    簡単な H T M L を追加して、アプリケーションが使用できないことをユーザーに通知し、ファイルを保存します。

  6. ソリューション エクスプローラー ウィンドウで、新しいファイルを右クリックし、[プロパティ] をクリックします。

  7. [ プロパティ ] ウィンドウの [ ビルド アクション ] 行で、[ なし] を選択します。

    プロパティ ウィンドウの [ビルド アクション] 行で、[なし] を選択します。

App_Offline ファイルの展開と削除

次の手順では、デプロイ ロジックを変更して、展開プロセスの開始時にファイルをコピー先サーバーにコピーし、最後に削除します。

Note

次の手順では、「プロジェクト ファイルについて」の説明に従って、カスタム MSBuild プロジェクト ファイルを使用して配置プロセス 制御していることを前提としています。 Visual Studio から直接デプロイする場合は、別の方法を使用する必要があります。 「 発行中に Web アプリをオフラインにする方法」で、Ibrahim Hashimi がそのようなアプローチの 1 つについて説明しています。

App_offline ファイルを展開先の IIS Web サイトに展開するには、Web 配置 contentPath プロバイダーを使用してMSDeploy.exeを呼び出す必要があります。 contentPath プロバイダーは、物理ディレクトリ パスと IIS Web サイトまたはアプリケーション パスの両方をサポートしているため、Visual Studio プロジェクト フォルダーと IIS Web アプリケーションの間でファイルを同期する場合に最適です。 ファイルをデプロイするには、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 プロジェクト ファイルを開きます。 Contact Manager サンプル ソリューションでは、これは Publish.proj ファイルです。

  2. ルート Project 要素で、App_offline配置の変数を格納する新しい PropertyGroup 要素を作成します。

    <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. GetAppOfflineAbsolutePath という名前の新しい Target 要素を追加します。 このターゲット内で 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 という名前の新しいターゲットを追加します。 このターゲット内で、App_offline ファイルをターゲット Web サーバーにデプロイする MSDeploy.exe コマンドを呼び出します。

    <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 Web サイト名]/[アプリケーション名] という形式の IIS アプリケーション パスです。 ターゲットに条件を含めると、ユーザーはプロパティ値を変更したり、コマンド ライン パラメーターを指定したりして、 App_offline 展開をオンまたはオフに切り替えることができます。

  9. DeleteAppOffline という名前の新しいターゲットを追加します。 このターゲット内で、App_offline ファイルを宛先 Web サーバーから削除する MSDeploy.exe コマンドを呼び出します。

    <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. 発行プロセスの適切なポイントで DeployAppOffline ターゲットと DeleteAppOffline ターゲットを呼び出すように MSBuild プロジェクト ファイルを変更します。

    <PropertyGroup>
      <FullPublishDependsOn>
        Clean;
        BuildProjects; 
        DeployAppOffline;
        GatherPackagesForPublishing;
        PublishDbPackages;
        DeployTestDBPermissions;
        PublishWebPackages;
        DeleteAppOffline;
      </FullPublishDependsOn> 
    </PropertyGroup>
    <Target Name="FullPublish" DependsOnTargets="$(FullPublishDependsOn)" />
    

カスタム MSBuild プロジェクト ファイルを実行すると、ビルドが成功した直後に 、App_offline ファイルがサーバーにデプロイされます。 その後、すべてのデプロイ タスクが完了すると、サーバーから削除されます。

展開パッケージへのApp_Offline ファイルの追加

展開の構成方法によっては、展開先の IIS Web アプリケーションにある既存のコンテンツ ( App_offline.htm ファイルなど) は、Web パッケージを展開先に展開するときに自動的に削除される場合があります。 展開の間 、App_offline.htm ファイルが確実に配置されるようにするには、展開プロセスの開始時にファイルを直接展開するだけでなく、Web 展開パッケージ自体にファイルを含める必要があります。

  • このトピックの前のタスクに従った場合は、別のファイル名 ( App_offline-template.htm を使用) で web アプリケーション プロジェクトに App_offline.htmファイルを追加し、ビルド アクションを None に設定します。 これらの変更は、ファイルが開発とデバッグに干渉しないようにするために必要です。 その結果、 App_offline.htmファイルが Web 展開パッケージに含まれるようにパッケージ化プロセスをカスタマイズする必要があります。

Web 発行パイプライン (WPP) は 、FilesForPackagingFromProject という名前の項目リストを使用して、Web デプロイ パッケージに含める必要があるファイルの一覧を作成します。 このリストに独自の項目を追加することで、Web パッケージの内容をカスタマイズできます。 これを行うには、次の大まかな手順を完了する必要があります。

  1. [プロジェクト名].wpp.targets という名前のカスタム プロジェクト ファイルを、プロジェクト ファイルと同じフォルダーに作成します。

    Note

    .wpp.targets ファイルは、ビルドと配置のプロセスを制御するために使用するカスタム プロジェクト ファイルと同じフォルダーではなく、Web アプリケーション プロジェクト ファイルと同じフォルダー (ContactManager.Mvc.csproj など) に配置する必要があります。

  2. .wpp.targets ファイルで、CopyAllFilesToSingleFolderForPackage ターゲットの前に実行される新しい MSBuild ターゲットを作成します。 これは、パッケージに含めるものの一覧を作成する 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 属性は、CopyAllFilesToSingleFolderForPackage ターゲットの直前に実行する必要があることを指定することで、このターゲットを WPP に挿入します。
  • FilesForPackagingFromProject 項目は DestinationRelativePath メタデータ値を使用して、ファイルの名前を App_offline-template.htm から App_offline.htm に変更し、リストに追加します。

次の手順では、この .wpp.targets ファイルを Web アプリケーション プロジェクトに追加する方法を示します。

.wpp.targets ファイルを Web 配置パッケージに追加するには

  1. Visual Studio 2010 でソリューションを開きます。

  2. [ソリューション エクスプローラー] ウィンドウで、Web アプリケーション プロジェクト ノード (ContactManager.Mvc など) を右クリックし、[追加] をポイントして、[新しい項目] をクリックします。

  3. [ 新しい項目の追加 ] ダイアログ ボックスで、 XML ファイル テンプレートを選択します。

  4. [ 名前 ] ボックスに 「[project name].wpp.targets 」( ContactManager.Mvc.wpp.targets など) と入力し、[ 追加] をクリックします。

    [名前] ボックスにプロジェクト名 .wpp.targets と入力し、[追加] をクリックします。

    Note

    プロジェクトのルート ノードに新しい項目を追加すると、プロジェクト ファイルと同じフォルダーにファイルが作成されます。 これを確認するには、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 ファイルを保存して閉じます。

次回 Web アプリケーション プロジェクトをビルドしてパッケージ化すると、WPP によって .wpp.targets ファイルが自動的に検出されます。 App_offline-template.htm ファイルは、結果の Web デプロイ パッケージにApp_offline.htmとして含まれます。

Note

デプロイに失敗した場合、 App_offline.htm ファイルはそのまま残り、アプリケーションはオフラインのままです。 これは通常、望ましい動作です。 アプリケーションをオンラインに戻すには、Web サーバーから App_offline.htm ファイルを削除します。 または、エラーを修正し、正常にデプロイを実行すると、 App_offline.htm ファイルが削除されます。

まとめ

このトピックでは、展開プロセスの開始時に App_offline.htmファイルを 移行先サーバーに発行し、最後に削除することで、Web アプリケーションを展開の間はオフラインにする方法について説明します。 また、web 展開パッケージに App_offline.htm ファイルを含める方法についても説明しました。

もっと読む

パッケージ化と展開プロセスの詳細については、「 Web アプリケーション プロジェクトのビルドとパッケージ化」、「 Web パッケージ展開のパラメーターの構成」、および「 Web パッケージの配置」を参照してください。

これらのチュートリアルで説明されているカスタム MSBuild プロジェクト ファイル アプローチを使用するのではなく、Visual Studio から Web アプリケーションを直接発行する場合は、発行プロセス中にアプリケーションをオフラインにするには、少し異なるアプローチを使用する必要があります。