ASP.NET MVC3では、従来までのASP.NETと同じようにフィルタという機能があります。このフィルタ機能では、例外処理やらアクションの実行前後で処理を行ったりといろいろな機能があります。そんなフィルタのなかでも、HandleErrorで今回はまってしまいました…。
Windowsアプリケーションでも集約イベントハンドラを利用しますが、ASP.NETでも同様の処理を行いたいものです。そのようなときには、HandleError属性を利用した例外のハンドリングを行います。ASP.NET MVC3の場合、global.aspxファイルにすでに仕込まれているので各コントローラーやアクションメソッドで個別に実装する必要は特にないのです。
global.aspx [sourcecode language="csharp"] public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } [/sourcecode]
MSDNや様々なブログにも記載があるとおりこのままでは、(少なくとも開発しているパソコン上で)HandleErrorは動作しません。web.configに設定を追加する必要があるからです。
web.config [sourcecode language="csharp"] <system.web> <customErrors mode="On" defaultRedirect="Error" /> </system.web> [/sourcecode]
さて、これで問題なく動作すると思いきや…動作しません。例外をスローして表示される画面は見苦しいスタックトレースの表示されたページです。web.configの内容や、(関係ないと思いつつ)web.config内の記述順序などを変更してみるも無残な結果に…。IISを再起動したりするけれども変化なし。
なんどもなんどもドキュメントを読み返しても問題があるようには思えない…。サンプルプロジェクトを作成してみだめ…。なぜかわからないままにおなかもすいてややイライラしていました。そんなときに、ソリューション構成を眺めていたところ、あることに気づきました。web.configが2つあるのです。
もちろん、私だってweb.configを各フォルダごとに配置して設定をオーバーライドすることができることは知っていました。ただ、自分がどのweb.configを修正しているのかあまり意識していなかった…。そんなわけで、web.configのうちViewフォルダに保存されたものを修正していたのでうまく動作しなかったわけです。
気づけば単純すぎる間違いだったのですが、気づくまでに時間がかかったのでメモしておきますw