1.21 jigowatts

Great Scott!

ASP.NET MVC実践してみました~あれ!System.Web.Mvc.dllがない!?

概要

ASP.NET MVCを仕事で使いたく独学でコソコソやってましたが、手ごろなプロジェクトがあったので実践してみました。ざっくりな仕様としては、データベースのデータを取ってきて表示するだけの簡単なWebアプリケーションです。
開発フェーズも中盤に差し掛かり、検証サーバで動作確認をしたところ、ブラウザが「System.Web.Mvcが見つかりません」とエラーメッセージを吐きました。調べてみると検証サーバにはASP.NET MVCランタイムがインストールされていませんでした/(^o^)\

環境

Visual Studio 2010
ASP.NET MVC2
SQLServer2008 R2
.NET Framework 4

詳細

基本的な実装を行いローカルでテスト、開発サーバにデプロイして動作確認をクリアし、検証サーバにデプロイしたら動きません!
ブラウザのエラーメッセージは次の通り。

パーサー エラー メッセージ: ファイルまたはアセンブリ ‘System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。

これって、ASP.NET MVCアプリケーションが動作するためには、System.Web.Mvc.dllというアセンブリが必要なんだけど、ないよってことですよね。
開発サーバと検証サーバの環境が違うだとッ!(真顔

原因

VisualStudio2010にはASP.NET MVC2がインストールされていますが、.NET Framework4にASP.NET MVCランタイムは含まれません。(なんだって!?
ソース:http://blogs.msdn.com/b/chack/archive/2010/06/14/asp-net-mvc-2-deployment-on-iis-7-5.aspx

ローカルはもちろん、開発サーバにもVisual Studioがインストールされていることにより、ASP.NET MVCランタイムがインストールされており、実行可能でした。
ところが、検証サーバ(本番も)上にはVisual Studioはもちろんとして、ASP.NET MVCランタイムがインストールされていませんでした。(あばばばば
.NET Framework4なら動くもんだと思ってましたよ。

解決

Microsoft Web開発ガイドラインには次のように書かれていました。
http://download.microsoft.com/download/7/C/E/7CE5CC56-F897-42B0-9E49-7301B451AE87/WebDevelopmentGuideline_Rev1.pdf

ASP.NET MVCをインストールすると、次のアセンブリがコンピュータ上のグローバルアセンブリキャッシュ(GAC)に配置されます。

ホスティングプロバイダがASP.NETバージョン3.5Server Pack1をインストールしている場合、アップロードする必要があるのはSystem.Web.Mvcアセンブリだけです。
Microsoft Web開発ガイドライン P.198より

今回の件では、都合上サーバ側はまったく触れないのでASP.NET MVCランタイムをインストールすることはできません。このため、必要なアセンブリをアップロードします。

アセンブリロード時は基本的に以下の2か所を検索するようです。

  1. グローバルアセンブリキャッシュ(GAC)
  2. アプリケーションフォルダ(bin)

GACにSystem.Web.Mvc.dllが存在しないので、パッケージビルド時に対象のアセンブリがローカルコピーされるよう設定します。

[参照設定]で”System.Web.Mvc”を選択し、[プロパティ]にてCopy LocalをTrueに変更します。
f:id:sh_yoshida:20150311155917p:plain


これによりbin展開されコードベースの検索の結果、アプリケーションが動作するようになります。

まとめ

ASP.NET MVCで開発したいという逸る気持ちが開発環境と検証環境は同じだと過程してしまい、開発環境のみの検証でことを進めたのがそもそもの過ちです。実績のないテクノロジーを投入する場合、入念な検証が必要なことを身をもって知りました。今回はなんとか動きましたが、全部Webフォームで作り直しになるかと...。新しい技術を試させてくれと言っておいて動きませんじゃシャレになりませんよね。ペロ

次からは検証サーバも含めて導入の検討と、検証サーバへの早期デプロイ(できればCIも)を実践するゾ☆