【发布时间】:2017-12-15 05:56:05
【问题描述】:
我有一个LoggingAttribute,它在OnActionExecuted 方法中记录请求和响应:
public class LoggingAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext httpContext)
{
//Logger.Log();
}
}
还有另一个属性用于验证请求并返回BadRequest。这个来自OnActionExecuting 方法的返回响应:
public class ValidateModelAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
var modelState = actionContext.ModelState;
if (!modelState.IsValid)
{
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, modelState);
}
}
}
现在,当我在 Action 方法上应用这两个属性时,我的 BadRequests 没有被记录,但是当我在控制器级别应用 LoggingAttribute 和在操作方法上应用 ValidateModelAttribute 时,BadRequests 正在被记录( OnActionExecuted 的 LoggingAttribute 被调用)。
有人可以解释一下这种行为,即OnActionExecuted 被调用,即使在控制器上应用属性时未执行操作方法。
【问题讨论】:
-
当您同时应用这两个属性时,您是否在 LoggingAttribute 上获得断点
-
如果同时在 actionmethod 上应用 - 否。如果 LoggingAttribute 在控制器级别,ValidateModetAttribute 在 action 方法上 - 是。
-
您是否尝试过更改 action 方法的顺序?
-
你添加了全局过滤器吗?
-
@programtreasures 刚刚检查它是否依赖于序列。如果我首先应用 LoggingAttribute,它的 OnActionExecuted 就会被调用。请在答案中添加解释。
标签: c# asp.net asp.net-web-api action-filter actionfilterattribute