onactionexecuting 与 onactionexecuted 中相同代码的执行时间

Execution time of same code in onactionexecuting vs onactionexecuted

我有一个基本控制器,方法 OnActionExecuted 有一些代码。

我想移动过滤器检查方法 OnActionExecuting

更改会带来任何性能问题吗?

不,这只是操作执行时间的问题:在调用 action 方法之前或之后

首先,(无论性能如何)您应该使用 method that is appropriate to your situation。如果你想在执行 action 方法之前执行,那么使用 OnActionExecuting。如果你想在动作执行后执行,那么使用OnActionExecuted.

至于性能,它们应该是完全一样的。控制器提供了两个空的虚拟方法供您在自己的控制器中实现(这里没有性能问题):

protected virtual void OnActionExecuting(ActionExecutingContext filterContext)
{
}

protected virtual void OnActionExecuted(ActionExecutedContext filterContext)
{
}

如果您查看 MVC source code(参见下面的代码示例),您会看到 ControllerActionInvoker 在调用操作之前简单地调用了 OnActionExecuting(preContext) 方法,然后调用了 OnActionExecuted(postContext) 操作完成后(或者如果抛出异常):

internal static ActionExecutedContext InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func<ActionExecutedContext> continuation)
{
    filter.OnActionExecuting(preContext);
    ...

    try
    {
        postContext = continuation();
    }
    catch (ThreadAbortException)
    {
        ...
        filter.OnActionExecuted(postContext);
        throw;
    }
    catch (Exception ex)
    {
        ...
        filter.OnActionExecuted(postContext);
        if (!postContext.ExceptionHandled)
        {
            throw;
        }
    }
    if (!wasError)
    {
        filter.OnActionExecuted(postContext);
    }
    return postContext;
}

我相信无论如何都会调用 OnActionExecutingOnActionExecuted 方法,即使调用的是空(未覆盖)方法,所以性能不应该是一个问题。