WebApi 2中的自定义ActionFilters

时间:2015-05-25 09:58:48

标签: asp.net-mvc asp.net-web-api asp.net-web-api2 custom-action-filter

我有两个ActionFilterAttribute - ValidateModelStateFilterLoggingFilter

ValidateModelStateFilter我有:

 public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (!actionContext.ModelState.IsValid)
        {
            actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
            base.OnActionExecuting(actionContext);
        }
    }

用于查找ModelState。在LoggingFilter我有:

public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        LogRequest(actionExecutedContext);

        base.OnActionExecuted(actionExecutedContext);

        LogRensponse(actionExecutedContext);
    }

我希望记录每个请求和每个响应,即使它包含任何ModelStateError。

现在,我的问题是:当ModelState无效时,它会按预期返回ErrorResponse,但Logging过滤器不会执行。

这是WebApiConfig.cs注册:

public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        // Configure Web API to use only bearer token authentication.
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
        config.Filters.Add(new AuthorizeAttribute());
       // config.Filters.Add(new ValidateNullFilter());

        config.Filters.Add(new ValidateModelStateFilter());
        config.Filters.Add(new LoggingFilter());


        config.Services.Replace(typeof(IExceptionHandler), new GlobalExceptionHandler());

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }

你有什么建议我怎么能让它发挥作用?

1 个答案:

答案 0 :(得分:0)

在您的日志过滤器中,您需要实现OnActionExecuting和OnActionExecuted

在调用您的操作之前,将调用OnActionExecuting方法,您可以在其中记录请求。 控制器操作运行后,将调用操作过滤器的OnActionExecuted方法,您可以在其中记录响应。