アクションフィルタとコントローラの OnActionExecuting の呼び出し順序
アクションメソッドの前後に、横断的な処理を挟むにはアクションフィルタを書く。
public virtual void OnActionExecuted(ActionExecutedContext filterContext);
public virtual void OnActionExecuting(ActionExecutingContext filterContext);
public virtual void OnResultExecuted(ResultExecutedContext filterContext);
public virtual void OnResultExecuting(ResultExecutingContext filterContext);
他方、コントローラは System.Web.Mvc.Controller
を継承するので、次のメソッドをオーバーライドすることができる。
protected virtual void OnActionExecuted(ActionExecutedContext filterContext);
protected virtual void OnActionExecuting(ActionExecutingContext filterContext);
protected virtual void OnResultExecuted(ResultExecutedContext filterContext);
protected virtual void OnResultExecuting(ResultExecutingContext filterContext);
今、やりたいのはセッション情報をアクションメソッドに渡すコトなので、これはアクションフィルタを書くしかなさそうに思える。
ただ、使い途はわからないなりに、せめてどちらが先に呼び出されるかを確認しておく。
アクションフィルタとコントローラの派生クラスの各メソッドを override してログを仕掛ける。
実験中…
無用な行を削除するとログは次のようになった。SessionAttribute
の行が、アクションフィルタの出力と読めばよい。
予想と違い、ベースクラスの OnActionExecuting の方がアクションフィルタより先に呼ばれていた。ふむ。
DEBUG|2014-11-30 13:55:59,420|Controller`1 |OnActionExecuting |IN
DEBUG|2014-11-30 13:55:59,421|SessionAttribute |OnActionExecuting |IN
DEBUG|2014-11-30 13:55:59,433|SessionAttribute |OnActionExecuted |IN
DEBUG|2014-11-30 13:55:59,433|Controller`1 |OnActionExecuted |IN
DEBUG|2014-11-30 13:55:59,434|Controller`1 |OnResultExecuting |IN
DEBUG|2014-11-30 13:55:59,434|SessionAttribute |OnResultExecuting |IN
DEBUG|2014-11-30 13:55:59,439|SessionAttribute |OnResultExecuted |IN
DEBUG|2014-11-30 13:55:59,439|Controller`1 |OnResultExecuted |IN
確認した環境
- Visual Studio Community 2015
- ASP.NET MVC 5.2.3
- Entity Framework 6.1.3
- SQL Server Express LoalDb 12.0.2000.8