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;
}
我相信无论如何都会调用 OnActionExecuting
和 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;
}
我相信无论如何都会调用 OnActionExecuting
和 OnActionExecuted
方法,即使调用的是空(未覆盖)方法,所以性能不应该是一个问题。