2014-06-20 10 views
5

Nella scrittura this answer, mi è stato chiesto se ci sono garanzie sul comportamento dello ActionFilterAttribute. e non ero in grado di rispondere con sicurezza.Sono garantite tutte le fasi di un ActionFilterAttribute?

In particolare, sono tutti e quattro i metodi OnActionExecuted, OnActionExecuting, OnResultExecuted & OnResultExecuting garantito essere chiamato per tutte le richieste che passano attraverso l'attributo, o presenza di circostanze (quali eccezioni, caduto connessione etc.) in cui uno o più delle fasi potrebbe non sparare?

risposta

2

No, non è garantito il richiamo.

Pensa ai filtri di autorizzazione. Se l'autorizzazione fallisce, ti aspetteresti che vengano eseguiti i filtri di azione? Quello potrebbe essere un grosso buco di sicurezza. Credo che un'eccezione fermerebbe anche la pipeline dei filtri e solo i filtri delle eccezioni verrebbero eseguiti da quel punto.

Dati i seguenti filtri:

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

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

sulla seguente azione di controllo:

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

Né il metodo Index() o OnActionExecuted() viene mai raggiunta perché OnActionExecuting() ha un'eccezione.

Problemi correlati