Soy nuevo en todo lo de MVC y estoy buscando volver a implementar algunos servicios WCF utilizando ASP.NET Web API. Como parte de eso, me gustaría implementar un filtro de acción que registre todas las acciones y excepciones, así como el tiempo, así que pensé que comenzaría con un filtro de acción, sin embargo, el filtro no se invoca.ASP.NET Web API ActionFilter ejemplo
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);
}
}
y en el controlador, tengo
[MyTrackingActionFilter]
public class MyResourceController : ApiController
{
...
}
Las rutas están configurados en Global.asax utilizando llamadas como:
var routeTemplate = ...
var defaults = new { controller = controllerName, action = methodName };
var constraints = new { httpMethod = new HttpMethodConstraint(myHTTPMethods.Split(',')) };
routes.MapHttpRoute(methodName, routeTemplate, defaults, constraints);
La cuestión es que el las acciones en MyResourceController se invocan como se espera y se ejecutan con éxito. El cliente puede consultar al servidor la información necesaria y todo se comporta bien, excepto que ninguno de los métodos de filtro de acción se invoca alguna vez.
Según entendí, el resto sucedió "automágicamente". Claramente, eso no es suficiente. ¿Alguna sugerencia sobre qué está mal? ¿Debo registrar estos en alguna parte?
NOTA: He intentado agregar el atributo tanto a la operación como a la clase y no funcionó. – WildeButNotOscar
ESTÁ 100% seguro de que las clases relacionadas con el Controlador API usan ActionFilter de System.Web.HttpFilters y NO la de System.Web.Mvc –
En la parte superior debería ver algo como: using System.Web.HttpFilters; –