2012-04-24 54 views
48

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?

+0

NOTA: He intentado agregar el atributo tanto a la operación como a la clase y no funcionó. – WildeButNotOscar

+0

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 –

+0

En la parte superior debería ver algo como: using System.Web.HttpFilters; –

Respuesta

169

tienes que estar seguro de que su código utiliza el ActionFilterAttribute del espacio de nombres System.Web.Http.Filters y no el de System.Web.Mvc.

Así que por favor compruebe que tiene

using System.Web.Http.Filters; 
+0

im buscando registrar todas las solicitudes y analizarlas? es esta pregunta y esta respuesta acerca de mi necesidad? ¿en caso afirmativo? cómo ? ¿Puedo hacer eso? –

+1

@sabertabatabaeeyazdi puede usar un filtro de acción para iniciar sesión – dotnetguy

+0

Para aquellos que se preguntan, use System.Web.Mvc si está construyendo una aplicación Mvc y use System.Web.Http.Filters si está construyendo Web Api (controlador heredado de ApiController) – suhendri

0

Como se mencionó Sander probé el código de abajo, su filtro de acción se está ejecutando.

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 es una lista de cadenas estática. si desea comprobar si OnActionExecuted se está ejecutando o no, puede volver a llamar al mismo método API, verá "OnActionExecuted" en la lista de Mensajes.