我对整个 MVC 很陌生,正在考虑使用 ASP.NET Web API 重新实现一些 WCF 服务。作为其中的一部分,我想实现一个操作过滤器来记录所有操作和异常以及计时,因此我认为我应该从操作过滤器开始,但是过滤器没有被调用。
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 上的操作按预期调用并成功运行。客户端能够向服务器查询必要的信息,并且所有行为都正常,只是没有调用任何操作过滤器方法。
我的理解是其余的事情“自动”发生。这显然还不够——对于哪里出了问题有什么建议吗?我需要在某处注册这些吗?