7

私は奇妙な動作に出くわしましたが、私がここで正しい方向にいるかどうかはわかりません。ControllerInstanceFilterProviderのフィルタの前に実行されたGlobalFilterCollectionのフィルタ

ControllerベースクラスのOnExceptionメソッドをオーバーライドするコントローラがあります。次のように

public class ControllerFiltersController : Controller { 

    public ActionResult Index() { 

     throw new NotImplementedException(); 
    } 

    protected override void OnException(ExceptionContext filterContext) { 

     Trace.TraceInformation(
      "ControllerFiltersController Exception: " + DateTime.Now.ToString("hh:mm:ss.fff") 
     ); 
    } 
} 

私もカスタムExceptionFilterを持っている:私は期待したもの

public static void RegisterGlobalFilters(GlobalFilterCollection filters) { 

    filters.Add(new HandleErrorCustom()); 
} 

コントローラインスタンスはこちらです:

public class HandleErrorCustom : IExceptionFilter { 

    public void OnException(ExceptionContext filterContext) { 

     Trace.TraceInformation(
      "HandleErrorCustom Exception Message: " + DateTime.Now.ToString("hh:mm:ss.fff") 
     ); 
    } 
} 

をその後、私はグローバルフィルタとしてそれを登録しましたControllerInstanceFilterProviderによって提供されるフィルタの順番がInt32.MinValueおよびtであるため、グローバルフィルタの前に実行するフィルタ彼の範囲はFilterScope.Firstです。

としても、ここで説明:ASP.NET MVC 3 Service Location, Part 4: Filters

しかし、結果は異なります。

iisexpress.exe情報:0:HandleErrorCustom例外メッセージ: 06:56:49.972

iisexpress.exe情報:0:ControllerFiltersController例外: 06:56:49.974

これはASP.NET MVC 4アプリケーションであり、ASP.NET MVC 3のフィルタの順序付け動作に影響する変更は認識していません。ここでは何が欠けていますか?

答えて

12

これは予想される動作です。

フィルタの順序は、情報が流れる方向によって異なります。情報がアクションに流入している場合、注文は予期した通りです。情報がアクションから戻ってきた場合は、順序が逆になります。

たとえば、F1、F2、F3の順に3つのフィルタがあるとします。これらがアクションフィルタであるとします(つまり、ActionExecutingとActionExecutedを待機しています)。次のようにシステムがそれらを実行するためには、次のとおりです。

F1.ActionExecuting() 
F2.ActionExecuting() 
F3.ActionExecuting() 
Action() 
F3.ActionExecuted() 
F2.ActionExecuted() 
F1.ActionExecuted() 

エラーハンドラは、定義により、アクションのリターン側で実行するフィルタであるため、その順序が逆です。

+0

今、私はそれを手に入れました。したがって、値が低く、アクションのリターン側で実行されるフィルタが最初に実行されます。ありがとう! – tugberk

関連する問題