このトピックでは、インターネット インフォメーション サービス (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 では、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という名前を 付 けます。
- ファイルが as-is展開されないようにするには、ビルド アクションを None に設定する必要があります。
App_offline ファイルを Web アプリケーション プロジェクトに追加するには
Visual Studio 2010 でソリューションを開きます。
ソリューション エクスプローラー ウィンドウで、Web アプリケーション プロジェクトを右クリックし、[追加] をポイントして、[新しい項目] をクリックします。
[ 新しい項目の追加 ] ダイアログ ボックスで、[ HTML ページ] を選択します。
[ 名前 ] ボックスに「 App_offline-template.htm」と入力し、[ 追加] をクリックします。
アプリケーションが使用できないことをユーザーに通知する簡単な HTML を追加し、ファイルを保存します。 サーバー側のタグ (たとえば、プレフィックスが "asp:" のタグ) は含めないでください。
ソリューション エクスプローラー ウィンドウで、新しいファイルを右クリックし、[プロパティ] をクリックします。
[ プロパティ ] ウィンドウの [ ビルド アクション ] 行で、[ なし] を選択します。
App_Offline ファイルの展開と削除
次の手順では、デプロイ プロセスの開始時にファイルをコピー先サーバーにコピーし、最後に削除するようにデプロイ ロジックを変更します。
注
次の手順では、「プロジェクト ファイルについて」の説明に従って、カスタム MSBuild プロジェクト ファイルを使用して配置プロセス を制御することを前提としています。 Visual Studio から直接デプロイする場合は、別の方法を使用する必要があります。 Sayed 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 ファイルをデプロイして削除するには
Visual Studio 2010 で、展開プロセスを制御する MSBuild プロジェクト ファイルを開きます。 Contact Manager サンプル ソリューションでは、これは Publish.proj ファイルです。
ルート Project 要素で、App_offline配置の変数を格納する新しい PropertyGroup 要素を作成します。
<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 タスクを使用できます。
GetAppOfflineAbsolutePath という名前の新しい Target 要素を追加します。 このターゲット内で ConvertToAbsolutePath タスクを使用して、プロジェクト フォルダー内の App_offline テンプレート ファイルへの絶対パスを取得します。
<Target Name="GetAppOfflineAbsolutePath" BeforeTargets="DeployAppOffline"> <ConvertToAbsolutePath Paths="$(AppOfflineSourcePath)"> <Output TaskParameter="AbsolutePaths" PropertyName="AppOfflineAbsoluteSourcePath" /> </ConvertToAbsolutePath> </Target>このターゲットは、プロジェクト フォルダー内の App_offline テンプレート ファイルへの相対パスを取得し、新しいプロパティに絶対ファイル パスとして保存します。 BeforeTargets 属性は、次の手順で作成する DeployAppOffline ターゲットの前に、このターゲットを実行することを指定します。
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>この例では、 ContactManagerIisPath プロパティはプロジェクト ファイル内の別の場所で定義されています。 これは、IIS Web サイト名/[アプリケーション名] という形式の IIS アプリケーション パスです。 ターゲットに条件を含めると、ユーザーはプロパティ値を変更するかコマンド ライン パラメーターを指定して、 App_offline 展開のオンとオフを切り替えることができます。
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>最後のタスクは、プロジェクト ファイルの実行中に適切なポイントでこれらの新しいターゲットを呼び出します。 これはさまざまな方法で行うことができます。 たとえば、 Publish.proj ファイルでは、 FullPublishDependsOn プロパティは、 FullPublish の既定のターゲットが呼び出されたときに順番に実行する必要があるターゲットの一覧を指定します。
発行プロセスの適切なポイントで 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 パッケージの内容をカスタマイズできます。 これを行うには、次の大まかな手順を完了する必要があります。
[プロジェクト名].wpp.targets という名前のカスタム プロジェクト ファイルをプロジェクト ファイルと同じフォルダーに作成します。
注
.wpp.targets ファイルは、ビルドと配置のプロセスを制御するために使用するカスタム プロジェクト ファイルと同じフォルダーではなく、Web アプリケーション プロジェクト ファイルと同じフォルダー (ContactManager.Mvc.csproj など) に配置する必要があります。
.wpp.targets ファイルで、CopyAllFilesToSingleFolderForPackage ターゲットの前に実行される新しい MSBuild ターゲットを作成します。 これは、パッケージに含める内容の一覧をビルドする 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 属性は、CopyAllFilesToSingleFolderForPackage ターゲットの直前に実行する必要があることを指定して、このターゲットを WPP に挿入します。
- FilesForPackagingFromProject 項目は DestinationRelativePath メタデータ値を使用して、ファイルの名前を App_offline-template.htm からリストに追加されたApp_offline.htm に変更します。
次の手順では、この .wpp.targets ファイルを Web アプリケーション プロジェクトに追加する方法を示します。
.wpp.targets ファイルを Web 配置パッケージに追加するには
Visual Studio 2010 でソリューションを開きます。
ソリューション エクスプローラー ウィンドウで、Web アプリケーション プロジェクト ノード (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 ファイルを保存して閉じます。
次に Web アプリケーション プロジェクトをビルドしてパッケージ化すると、WPP によって .wpp.targets ファイルが自動的に検出されます。 App_offline-template.htm ファイルは、結果の Web 配置パッケージにApp_offline.htmとして含まれます。
注
デプロイが失敗した場合、 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 アプリケーションを発行する場合は、発行プロセス中にアプリケーションをオフラインにするには、少し異なるアプローチを使用する必要があります。