ASP.NET Web API ActionFilter示例

我是新来的整个MVC的东西,并正在寻找重新实现一些使用ASP.NET Web API的WCF服务。 作为其中的一部分,我想实现一个动作filter,logging所有的动作和exception以及时间,所以我想我会开始一个动作filter,但是filter不被调用。

public class MyTrackingActionFilter : ActionFilterAttribute, IExceptionFilter { private Stopwatch stopwatch = new Stopwatch(); public void OnException(ExceptionContext filterContext) { ... } public override void OnActionExecuted(ActionExecutedContext filterContext) { ... } public override void OnActionExecuting(ActionExecutingContext filterContext) { this.stopwatch.Start(); Trace.TraceInformation(" Entering {0}", filterContext.RouteData); } 

}

在控制器上,我有

 [MyTrackingActionFilter] public class MyResourceController : ApiController { ... } 

在Global.asax中使用如下调用来设置路由:

 var routeTemplate = ... var defaults = new { controller = controllerName, action = methodName }; var constraints = new { httpMethod = new HttpMethodConstraint(myHTTPMethods.Split(',')) }; routes.MapHttpRoute(methodName, routeTemplate, defaults, constraints); 

问题是MyResourceController上的操作按预期调用并成功运行。 客户端能够向服务器查询必要的信息,并且所有行为都很好,除了没有任何操作filter方法被调用。

我的理解是,其余的都是“自动地”发生的。 这显然是不够的 – 关于什么是错误的任何暗示? 我需要在某处注册吗?

您必须确保您的代码使用System.Web.Http.Filters命名空间中的ActionFilterAttribute,而不是System.Web.Mvc中的ActionFilterAttribute。

所以请检查你有没有

  using System.Web.Http.Filters; 

正如桑德提到,我尝试了下面的代码,其行为filter正在执行。

 public class WebAPIActionFilterAttribute : System.Web.Http.Filters.ActionFilterAttribute { public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { PersonController.Messages.Add("OnActionExecuted"); } public override void OnActionExecuting(HttpActionContext actionContext) { PersonController.Messages.Add("OnActionExecuting"); } } public class WebAPIExceptionFilter : System.Web.Http.Filters.ExceptionFilterAttribute { public override void OnException(HttpActionExecutedContext actionExecutedContext) { PersonController.Messages.Add("OnException"); actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.NotFound) { Content = new StringContent("Something went wrong") }; } } 

PersonController.Messages是一个静态的string列表。 如果你想检查OnActionExecuted是否得到执行,你可以再次调用相同的API方法,你会看到消息列表中的“OnActionExecuted”。