7

私は奇妙な行動に出くわしましたが、私がここで正しい軌道に乗っているかどうかはわかりません。

基本クラスOnExceptionのメソッドをオーバーライドするコントローラーがあります。Controller

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 class HandleErrorCustom : IExceptionFilter {

    public void OnException(ExceptionContext filterContext) {

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

次に、それをグローバルフィルターとして登録しました。

public static void RegisterGlobalFilters(GlobalFilterCollection filters) {

    filters.Add(new HandleErrorCustom());
}

私が期待したのは、コントローラーインスタンスフィルターControllerInstanceFilterProviderがグローバルフィルターの前に実行されることです。これは、によって提供されるフィルターの順序がでInt32.MinValueあり、それらのスコープがであるためですFilterScope.First

ここでも説明されているように:ASP.NET MVC 3サービスの場所、パート4:フィルター

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

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

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

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

4

1 に答える 1

13

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

フィルタの順序は、情報が流れる方向によって異なります。情報がアクションに流れ込んでいる場合、順序は予想どおりです。情報がアクションから逆流している場合は、順序が逆になります。

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

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

エラーハンドラーは、定義上、アクションの戻り側で実行されるフィルターであるため、順序が逆になります。

于 2012-04-19T16:49:14.587 に答える