ASP.NET MVC 3が正式提供されたのでWindows Azureで動かしてみましょう。
Windows Azure Tools for Visual Studio 2010 1.3では「.NET Framework 4 role」として「ASP.NET MVC 2 Web Role」は提供されていますが、2011/01/16時点では「ASP.NET MVC 3 Web Role」はまだ提供されていません。
でも、あきらめる必要はなくもちろん解決策はあります。「Windows Azure上で帳票コンポーネント「ActiveReports for .NET 6.0J」を動作させてみた 」と同様に必要なdllの参照設定のプロパティで[ローカルコピー]プロパティを「True」に設定すればよいはずです。
Azureに配置したいASP.NET MVC 3プロジェクトを作成する
ASP.NET MVC 3の問題とAzureに配置したことによる問題を切り分けるためにも最初はASP.NET MVC 3プロジェクトとしてコード記述とデバッグを実行しておくことをお勧めします。
今回の主眼はAzureに配置して動かすための基礎情報の収集ですのでASP.NET MVC 3アプリとしてはテンプレートから自動生成した簡単なものとします。
[新しいプロジェクト]ダイアログで[Web]-[ASP.NET MVC 3 Web Application]テンプレートを選択して「MVC3Hello」という名前でプロジェクトの新規作成を行います。
ASP.NET MVC 2では「ASP.NET MVC 2 空のWebアプリケーション」ASP.NET MVC 3のテンプレートではテンプレート選択後に「空のWebアプリ」と「初期設定のWebアプリ」のどちらを生成するかを選択するように変わりました。
今回は「Internet Application」でView engineとして「Razor」を選択したいと思います。
ASP.NET MVC 3アプリをローカル環境で動作確認
生成された新規プロジェクトを実行すれば、ASP.NET開発サーバーが自動的に起動されてASP.NET MVC 3アプリが表示されます。
Windows Azureプロジェクトに既存ASP.NET MVC 3アプリを組み込む
ASP.NET MVC 3アプリの正常動作を確認したらそのプロジェクトはいったん終了して、[新しいプロジェクト]として「Windows Azure Project」を作成します。
検証環境にはWindows Azure for Visual Studio 2010 1.3がインストールされていますので、このテンプレートで作成されるプロジェクトもAzureのGuest OS 2.0に対応したものになります。
Windows Azureの稼働環境はロールとして定義しますので、Windows Azure Projectの新規作成時にも「.NET Framework 4 roles」が選べるようになっています。ここに「ASP.NET MVC 3 Web Role」があれば苦労はないのですが現時点ではありませんので、Windwos Azure Solutionにはロールを追加せずに生成を完了します。
作成済のASP.NET MVC 3プロジェクトをWindows Azure Solutionに追加する
ソリューションエクスプローラで[ソリューション]を右クリックして[追加]-[既存のプロジェクト]メニューを選択し、ダイアログで「MVC3Hello.vbproj」(C#のでMVC 3アプリを作成した場合はMVC3Hello.csproj)を選択します。
ASP.NET MVC 3プロジェクトをWeb Roleプロジェクトして追加
Windows Azureプロジェクトの「Roles」を右クリックして[Add]-[Web Role Project in Solution]メニューを選択して「MVC3Hello」をWebロールとして追加します。
ASP.NET MVC 3プロジェクトの参照設定をローカルコピーに変更する
MVC3Helloプロジェクトのプロパティで参照設定を確認すると、
- System.Web.Mvc
- System.Web.Helpers
- System.Web.WebPages
の3つのdllのパスがGACではないところに登録されています。
そこでこの3つのdllの参照設定の[ローカルコピー]プロパティを「True」に変更します。VBの場合、ソリューションエクスプローラで「すべてのファイルを表示」としてから該当のDLLを選んでプロパティウィンドウで変更します。
Windows Azureの開発環境で動作確認する
ここまで設定したらデバッグ実行すればWindows Azureの開発環境でCompute Emulatorを使って実行確認できます。
ただし、そのためにはVisual Studioを管理者として実行していなければならないので次のようなエラーが出た場合は一度Visual Studioを終了して起動アイコンを右クリックして「管理者として実行」を選択して、それから該当のソリューションを読み込んでください。
また、今回のようにWindows Azure Storage Serviceを使っていないようなときでもデフォルト設定ではStorage Emulatorが起動されてSQL Server Express Editionを必要としますので、SQL Server Express Editionのサービスを上げておくか、「Start Windows Azure Storage Emulator」の設定を「False」にしておいてください。
ここまで設定すればASP.NET MVC 3アプリをWindows Azureの開発環境で動作させることができますので早速実行してみましょう。
Windows Azureの実行環境にデプロイして動作確認する
ソリューションエクスプローラでWindows Azure プロジェクトを右クリックして[発行]メニューを選択してDeployを行います。
すでにアプリをデプロイ済だった場合は次のようなダイアログが表示されるので[Delete and Continue]ボタンをクリックして処理を継続します。
SDK 1.3でデプロイ時間が短くなったとの事ですが、確かに以前は16~20分かかっていたのが11分くらいに短縮されています。
それでは、Website URLに書かれたURLをクリックして動作確認してみましょう。
このように残念な結果になるのはASP.NET MVC 3の動作に必要でWindows Azure上に存在しないDLLを転送できていないからです(実際は詳細のエラーを表示するようにweb.configを書き換えてエラー表示により確認しました)。
ASP.NET MVC 3をWindows Azureで動作させるのに必要なDLL
最初に参照設定されていた3つのDLLの[ローカルコピー]を「True」にしていましたが色々調べてみると、そのDLLが使っているDLLがあるようです。
「参照の追加」でSystem.Web.MvcのパスにあるDLLを確認してたところ、最初の3つ以外にも次のDLLが必要だという事が分かりました。
- System.Web.Mvc
- Microsoft.Web.Infrastructure
- NuGet.Core
- System.Web.Helpers
- System.Web.Razor
- System.Web.WebPages
- System.Web.WebPages.Administration
- System.Web.WebPages.Deployment
- System.Web.WebPages.Razor
同じパスにあるWebMatrix.DataとWebMatrix.WebDataの設定は不要でした。たぶん、WebMatrixを使わないのならばいらないのだと思います。
ASP.NET MVC 3 Azureアプリ
以上の設定によりASP.NET MVC 3アプリはWebRoleとしてWindows Azure上で無事稼働します。