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

时间:2015-10-26 09:01:24

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 asp.net-mvc-5

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

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

此更改是否会提供任何性能问题?

2 个答案:

答案 0 :(得分:2)

首先,(无论性能如何),您应该使用method that is appropriate to your situation。如果要在执行操作方法之前执行执行,请使用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方法将被调用,即使它是被调用的空(非重写)方法,因此性能不应该是一个问题。

答案 1 :(得分:0)

不,它只是执行操作时的一个元素:在调用操作方法之前或之后