web-dev-qa-db-fra.com

Exemple d'ActionFilter API Web ASP.NET

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?

53
WildeButNotOscar

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;
176
S P

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. 

0
Murali