Je suis novice dans l'ensemble de MVC et envisage de réimplémenter certains services WCF à l'aide de l'API Web ASP.NET. Dans ce cadre, j'aimerais implémenter un filtre d'action qui enregistre toutes les actions et les exceptions, ainsi que le minutage. J'ai donc pensé commencer par un filtre d'action, mais le filtre n'est pas appelé.
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);
}
}
et sur le contrôleur, j'ai
[MyTrackingActionFilter]
public class MyResourceController : ApiController
{
...
}
Les itinéraires sont configurés dans Global.asax en utilisant des appels tels que:
var routeTemplate = ...
var defaults = new { controller = controllerName, action = methodName };
var constraints = new { httpMethod = new HttpMethodConstraint(myHTTPMethods.Split(',')) };
routes.MapHttpRoute(methodName, routeTemplate, defaults, constraints);
Le problème est que les actions sur MyResourceController sont appelées comme prévu et exécutées avec succès. Le client peut interroger le serveur pour obtenir les informations nécessaires et tout se comporte bien, à l'exception du fait qu'aucune des méthodes de filtrage d'action n'est invoquée.
Je croyais comprendre que le reste s'était passé "automatiquement". Ce n'est clairement pas assez - Des suggestions sur ce qui ne va pas? Dois-je les enregistrer quelque part?
Vous devez vous assurer que votre code utilise le ActionFilterAttribute
du System.Web.Http.Filters
namespace et pas celui du System.Web.Mvc
.
Alors s'il vous plaît vérifier que vous avez
using System.Web.Http.Filters;
Comme Sander l'a mentionné, j'ai essayé le code ci-dessous, son filtre d'action est en cours d'exécution.
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 est une liste de chaînes statiques. si vous voulez vérifier si OnActionExecuted est exécuté ou non, vous pouvez appeler la même méthode API à nouveau, vous verrez le "OnActionExecuted" dans la liste des messages.