route net mvc iasyncactionfilter iactionfilter filters attribute asp c# asp.net-web-api

c# - mvc - Ejemplo de ASP.NET Web API ActionFilter



net core exception filter (2)

Como mencionó Sander, probé el siguiente código, 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.

Soy nuevo en todo lo de MVC y estoy buscando volver a implementar algunos servicios de WCF usando 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.

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 se configuran en Global.asax usando 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);

El problema es que 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?