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 つのプロジェクト ファイル (すべての配置先環境に適用されるビルド命令を含んだファイルと、環境に特化したビルド設定や配置設定を含んだファイル) で制御するものになっています。 ビルド時には、環境に特化したプロジェクト ファイルが環境に依存しないプロジェクト ファイルにマージされ、ビルド命令の完全なセットが形成されます。

タスクの概要

多くのシナリオでは、データベースや Web サービスなどの関連コンポーネントに変更を加える間、Web アプリケーションをオフラインにする必要があります。 通常、IIS と ASP.NET では、IIS Web サイトまたは Web アプリケーションのルート フォルダーに App_offline.htm という名前のファイルを配置することでこれを実現します。 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 サンプル ソリューションを使用して、トピックの例に従うことができます。

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

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

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

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

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

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

  3. [新しい項目の追加] HTMLで、[HTML ページ] を選びます。

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

    In the Name box, type App_offline-template.htm, and then click Add.

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

    Add some simple H T M L to inform users that the application is unavailable, and then save the file.

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

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

    In the Properties window, in the Build Action row, select None.

App_Offline ファイルの配置と削除

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

Note

次の手順では、「プロジェクト ファイルについて」の説明に従って、カスタム MSBuild プロジェクト ファイルを使用して配置プロセスを制御することを前提としています。 Visual Studio から直接配置する場合は、別の方法を使用する必要があります。 Ibrahim Hashimi は、公開中に Web アプリをオフラインにする方法」で そのようなアプローチの 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 を使用) の下に App_offline.htm ファイルを Web アプリケーション プロジェクトに追加し、ビルド アクションを 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. [名前] ボックスに「[プロジェクト名].wpp.targets (ContactManager.Mvc.wpp.targets など)」と入力し、[追加] をクリックします。

    In the Name box, type project name .wpp.targets, then click Add.

    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 アプリケーションを発行する場合は、発行プロセス中にアプリケーションをオフラインにするには、少し異なるアプローチを使用する必要があります。