Hatena::ブログ(Diary)

Kazzzの日記 このページをアンテナに追加 RSSフィード

2009-10-12

[][]ASP.NET MVCソースコードデバッグ(トレース)する


ASP.NET MVCの素晴らしい特徴の一つはオープンソースであり、ソースコードが公開されていることである。
ビューからポストされたHTML Formデータから、生成したモデルクラスプロパティがどのようにセットされているのかを見たくて、ASP.NET MVCのソースコードを使ってデバッグトレースしてみようと思ったが、公開されているソースコードが含まれるプロジェクト自分の作ったプロジェクトから参照するだけでは上手くいかない。

具体的には、起動時に以下の例外が発生して開始ページが表示できないのだ。
f:id:Kazzz:20091011211040p:image

最初は、元々のASP.NET MVCのアセンブリは厳密な名前署名されており(つまりGACのアセンブリを参照している)、その参照が残っているか、又はコピーされたアセンブリがbin等に残っているせいだと思ったのだが、ソリューションクリアにしても状況が変わらなかった。

そこでweb.configを見てみたのだが、案の定、コンパイルに必要なアセンブリはGACのものが指定されていた。(普通そうだけど...だからGACは嫌いだ)

  • プロジェクト直下のweb.config
<compilation debug="true">
  <assemblies>
    <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add assembly="System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add assembly="System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
  </assemblies>
</compilation>

該当のアセンブリを厳密名無しのものも使えるように変更してみる。

    
    <add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>

これで起動できるようになった。

しかし、自分が用意したビューを表示させようと該当のビューのURLを叩くと、今度は以下の例外が発生した。
f:id:Kazzz:20091011211041p:image

そのまま進めると、ビューには以下のエラーが表示される。
f:id:Kazzz:20091011211043p:image

どうやらビューのスクリプトレット構文が正しくコンパイルできていないようだが、今度はどこを直せば良いのかさっぱりだ。

これでお手上げかと思ったのだが、調べてみると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
<pages
    validateRequest="false"
    pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
  <controls>
    <add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
  </controls>
</pages>

pageエレメントの'System.Web.Mvc'のアセンブリのPublicKeyTokenを全てnullに修正した。

  • Views下のweb.config(非GAC)
<pages
    validateRequest="false"
    pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
    pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
    userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
  <controls>
    <add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" namespace="System.Web.Mvc" tagPrefix="mvc" />
  </controls>
</pages>

これでやっと目的のことができるようになった。(デプロイ時にはアセンブリの指定をきちんと元に戻す必要がある、かな)

f:id:Kazzz:20091011211042p:image

モデルクラスのNameプロパティがセットされようにとしている所だが、同クラスの型付けを施されたViewからポスト時に、

ハンドラのリクエスト処理

コントローラアクション処理

モデルバインダによるパラメタバインド

DefaultModelBinderのSetPropertyメソッド

と呼ばれていることが解る。

ASP.NET MVCは1から書かれたものではなく、ASP.NETを拡張して作られているため比較的コード量も少ない。仕組みを知るために実行したり読んだりするのに最適だ。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/Kazzz/20091012/p1