我有一个基本控制器,方法OnActionExecuted
有一些代码。
我想移动过滤器检查方法OnActionExecuting
。
此更改是否会提供任何性能问题?
答案 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;
}
我相信OnActionExecuting
和OnActionExecuted
方法将被调用,即使它是被调用的空(非重写)方法,因此性能不应该是一个问题。
答案 1 :(得分:0)
不,它只是执行操作时的一个元素:在调用操作方法之前或之后