ASP.NET MVCのソースコードをデバッグ(トレース)する
ASP.NET MVCの素晴らしい特徴の一つはオープンソースであり、ソースコードが公開されていることである。
ビューからポストされたHTML Formデータから、生成したモデルクラスのプロパティがどのようにセットされているのかを見たくて、ASP.NET MVCのソースコードを使ってデバッグトレースしてみようと思ったが、公開されているソースコードが含まれるプロジェクトを自分の作ったプロジェクトから参照するだけでは上手くいかない。
具体的には、起動時に以下の例外が発生して開始ページが表示できないのだ。
最初は、元々のASP.NET MVCのアセンブリは厳密な名前で署名されており(つまりGACのアセンブリを参照している)、その参照が残っているか、又はコピーされたアセンブリがbin等に残っているせいだと思ったのだが、ソリューションをクリアにしても状況が変わらなかった。
そこでweb.configを見てみたのだが、案の定、コンパイルに必要なアセンブリはGACのものが指定されていた。(普通そうだけど...だからGACは嫌いだ)
- プロジェクト直下のweb.config
該当のアセンブリを厳密名無しのものも使えるように変更してみる。
これで起動できるようになった。
しかし、自分が用意したビューを表示させようと該当のビューのURLを叩くと、今度は以下の例外が発生した。
どうやらビューのスクリプトレット構文が正しくコンパイルできていないようだが、今度はどこを直せば良いのかさっぱりだ。
これでお手上げかと思ったのだが、調べてみるとApress社が出版するPro ASP.NET MVCの著者であるSteve Sanderson氏のブログにそのものずばりのエントリがあった。
Using the ASP.NET MVC source code to debug your app « Steve Sanderson’s blog
このエントリによると、強く型付けされたビューを使う場合、プロジェクトのViewディレクトリ下にもweb.configがあり、その中のpageParserFilterTypeが属するのアセンブリ(System.Web.Mvc)もGACのが指定されているので、そこも同様に修正が必要だとのこと。
- Views下のweb.config
pageエレメントの'System.Web.Mvc'のアセンブリのPublicKeyTokenを全てnullに修正した。
- Views下のweb.config(非GAC)
これでやっと目的のことができるようになった。(デプロイ時にはアセンブリの指定をきちんと元に戻す必要がある、かな)
モデルクラスのNameプロパティがセットされようにとしている所だが、同クラスの型付けを施されたViewからポスト時に、
ハンドラのリクエスト処理
↓
コントローラのアクション処理
↓
モデルバインダによるパラメタバインド
↓
DefaultModelBinderのSetPropertyメソッド
と呼ばれていることが解る。
ASP.NET MVCは1から書かれたものではなく、ASP.NETを拡張して作られているため比較的コード量も少ない。仕組みを知るために実行したり読んだりするのに最適だ。