2014-06-20 2 views
5

En écrivant this answer, on m'a demandé s'il y avait des garanties sur le comportement du ActionFilterAttribute. et j'étais incapable de répondre avec confiance.Toutes les phases d'un ActionFilterAttribute sont-elles garanties d'être appelées?

En particulier, sont les quatre méthodes OnActionExecuted, OnActionExecuting, OnResultExecuted & OnResultExecuting garantie d'être appelé pour toutes les demandes qui passent par l'attribut, ou sont circonstances, (comme les exceptions, la connexion, etc. abandonné) où un ou plusieurs des phases pourraient ne pas tirer?

Répondre

2

Non, ils ne sont pas garantis d'être appelés.

Pensez aux filtres d'autorisation. Si l'autorisation échoue, vous attendez-vous à ce que des filtres d'action soient exécutés? Cela pourrait être un gros trou de sécurité. Je crois qu'une exception arrêterait également le pipeline de filtres et seuls les filtres d'exception seraient exécutés à partir de ce point.

Étant donné le filtre suivant:

public class ExampleFilterAttribute : FilterAttribute, IActionFilter 
{ 
    public void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     // this code is never reached... 
    } 

    public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     throw new NotImplementedException(); 
    } 
} 

sur l'action du contrôleur suivant:

[ExampleFilter] 
public ActionResult Index() 
{ 
    // this code is never reached... 
    return View(); 
} 

Ni la méthode Index() ou OnActionExecuted() est jamais atteint parce que OnActionExecuting() a une exception.

Questions connexes