Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Applicazione di filtri in ASP.NET MVC

In ASP.NET MVC i controller definiscono metodi di azione che dispongono in genere di una relazione uno-a-uno con le possibili interazioni dell'utente, ad esempio il clic su un collegamento o l'invio di un form. Ad esempio, quando l'utente fa clic su un collegamento, una richiesta viene indirizzata al controller designato e viene chiamato il metodo di azione corrispondente.

È possibile che si desideri eseguire la logica prima della chiamata di un metodo di azione oppure dopo l'esecuzione di un metodo di azione. A tale scopo, in ASP.NET MVC vengono forniti i filtri. I filtri sono classi personalizzate che forniscono strumenti dichiarativi e programmatici per l'aggiunta del comportamento pre-azione e post-azione ai metodi di azione del controller.

Come complemento a questo argomento è disponibile un progetto di Visual Studio con codice sorgente che è possibile scaricare.

In ASP.NET MVC sono supportati i tipi di filtri azioni seguenti:

  • Filtri di autorizzazione. Implementano IAuthorizationFilter e consentono di prendere decisioni relative alla sicurezza riguardanti l'esecuzione o meno di un metodo di azione, ad esempio l'autenticazione o la convalida delle proprietà della richiesta. La classe AuthorizeAttribute e la classe RequireHttpsAttribute sono esempi di filtri di autorizzazione. I filtri di autorizzazione vengono eseguiti prima di qualsiasi altro filtro.

  • Filtri azioni. Implementano IActionFilter e consentono di eseguire il wrapping dell'esecuzione del metodo di azione. L'interfaccia IActionFilter dichiara due metodi: OnActionExecuting e OnActionExecuted. OnActionExecuting viene eseguito prima del metodo di azione. OnActionExecuted viene eseguito dopo il metodo di azione e può eseguire ulteriori operazioni di elaborazione, ad esempio può fornire dati aggiuntivi al metodo di azione, controllare il valore restituito o annullare l'esecuzione del metodo di azione.

  • Filtri dei risultati. Implementano IResultFilter e consentono di eseguire il wrapping dell'esecuzione dell'oggetto ActionResult. IResultFilter dichiara due metodi: OnResultExecuting e OnResultExecuted. OnResultExecuting viene eseguito prima dell'oggetto ActionResult. OnResultExecuted viene eseguito dopo l'esecuzione del risultato e può eseguire ulteriori operazioni di elaborazione del risultato, ad esempio può modificare la risposta HTTP. La classe OutputCacheAttribute è un esempio di filtro del risultato.

  • Filtri eccezioni. Implementano IExceptionFilter e vengono eseguiti se viene generata un'eccezione non gestita durante l'esecuzione della pipeline ASP.NET MVC. I filtri eccezioni possono essere utilizzati per attività quali la registrazione o la visualizzazione di una pagina di errore. La classe HandleErrorAttribute è un esempio di filtro eccezioni.

La classe Controller implementa ognuna delle interfacce del filtro. È possibile implementare qualsiasi filtro per un controller specifico eseguendo l'override del metodo On<Filter> del controller. È possibile ad esempio eseguire l'override del metodo OnAuthorization. Il controller semplice (Simple) incluso nell'esempio scaricabile esegue l'override di ognuno dei filtri e scrive le informazioni diagnostiche all'esecuzione di ogni filtro. In un controller è possibile implementare i metodi On<Filter> seguenti:

In ASP.NET MVC sono inclusi i filtri seguenti, implementati come attributi. I filtri possono essere applicati a livello di metodo di azione, di controller o di applicazione.

  • AuthorizeAttribute . Limita l'accesso mediante autenticazione e, facoltativamente, mediante autorizzazione.

  • HandleErrorAttribute . Specifica come gestire un'eccezione generata da un metodo di azione.

    NotaNota:

    Questo filtro rileva le eccezioni solo se l'elemento customErrors è abilitato nel file Web.config.

  • OutputCacheAttribute . Fornisce la cache di output.

  • RequireHttpsAttribute . Forza il reinvio delle richieste HTTP non sicure tramite HTTPS.

È possibile creare un filtro nei modi seguenti:

  • Eseguire l'override di uno o più metodi On<Filter> del controller.

  • Creare una classe Attribute che derivi da ActionFilterAttribute e applicare l'attributo a un controller o a un metodo di azione.

  • Registrare un filtro con il provider di filtri, ad esempio la classe FilterProviders.

  • Registrare un filtro globale mediante la classe GlobalFilterCollection.

Un filtro può implementare la classe ActionFilterAttribute astratta. Alcuni filtri, ad esempio AuthorizeAttribute, implementano direttamente la classe FilterAttribute. I filtri di autorizzazione vengono chiamati sempre prima dell'esecuzione del metodo di azione e prima tutti gli altri tipi di filtro. Altri filtri azione, ad esempio OutputCacheAttribute, implementano la classe ActionFilterAttribute astratta che consente l'esecuzione del filtro azione prima o dopo l'esecuzione del metodo di azione.

È possibile utilizzare l'attributo del filtro in modo dichiarativo con i metodi di azione o i controller. Se l'attributo contrassegna un controller, il filtro di azione si applicherà a tutti i metodi di azione in tale controller.

Nell'esempio seguente viene illustrata l'implementazione predefinita della classe HomeController. L'attributo HandleError nell'esempio viene utilizzato per contrassegnare il controller. Il filtro si applicherà quindi a tutti i metodi di azione nel controller.


[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}


È possibile registrare più provider di filtri. I provider di filtri vengono registrati mediante la proprietà Providers statica. Il metodo GetFilters(ControllerContext, ActionDescriptor) aggrega i filtri di tutti i provider in un singolo elenco. I provider possono essere registrati in qualsiasi ordine. L'ordine in cui vengono registrati non influisce sull'ordine di esecuzione del filtro.

NotaNota:

I provider di filtri sono una nuova funzionalità in ASP.NET MVC 3.

Per impostazione predefinita, in ASP.NET MVC vengono registrati i provider di filtri seguenti:

Il metodo GetFilters restituisce tutte le istanze di IFilterProvider presenti nel localizzatore di servizi.

I filtri vengono eseguiti nell'ordine seguente:

  1. Filtri di autorizzazione

  2. Filtri azioni

  3. Filtri di risposta

  4. Filtri eccezioni

Ad esempio, i filtri di autorizzazione vengono eseguiti per primi e i filtri eccezioni vengono eseguiti per ultimi. All'interno di ogni tipo di filtro il valore Order specifica l'ordine di esecuzione. All'interno di ogni tipo e ordine di filtro il valore di enumerazione Scope specifica l'ordine dei filtri. Questa enumerazione definisce i valori di ambito del filtro seguenti (nell'ordine di esecuzione):

  1. First

  2. Global

  3. Controller

  4. Action

  5. Last

Ad esempio, un filtro azioni con la proprietà Order impostata su zero e l'ambito del filtro impostato su First viene eseguito prima di un filtro azioni con la proprietà Order impostata su zero e l'ambito del filtro impostato su Action.

L'ordine di esecuzione dei filtri con lo stesso tipo, ordine e ambito non è definito.

I filtri OnActionExecuting(ActionExecutingContext), OnResultExecuting(ResultExecutingContext) e OnAuthorization(AuthorizationContext) vengono eseguiti in avanti. I filtri OnActionExecuted(ActionExecutedContext), OnResultExecuting(ResultExecutingContext) e OnException(ExceptionContext) vengono eseguiti in ordine inverso.

NotaNota:

In ASP.NET MVC versione 3 l'ordine di esecuzione dei filtri eccezioni è stato modificato per i filtri eccezioni con lo stesso valore Order. In ASP.NET MVC 2 e versioni precedenti i filtri eccezioni del controller con lo stesso valore Order di quelli di un metodo di azione venivano eseguiti prima dei filtri eccezioni del metodo di azione. Si tratta in genere del caso in cui i filtri eccezioni vengono applicati senza un valore Order specificato. In ASP.NET MVC 3 questo ordine è stato invertito in modo che il gestore di eccezioni più specifico venga eseguito per primo. Per ulteriori informazioni, vedere la sezione relativa all'ordine dei filtri più avanti in questo argomento.

È possibile annullare l'esecuzione di un filtro nei metodi OnActionExecuting e OnResultExecuting impostando la proprietà Result su un valore non null. Tutti i filtri OnActionExecuted e OnActionExecuting in sospeso non verranno richiamati e l'invoker non chiamerà il metodo OnActionExecuted per il filtro annullato o per i filtri in sospeso. Verrà eseguito il filtro OnActionExecuted per i filtri eseguiti in precedenza e verranno eseguiti tutti i filtri OnResultExecuting e OnResultExecuted.

Si supponga, ad esempio, di disporre di un'applicazione ASP.NET MVC con un controller Home e un controller semplice. All'applicazione viene applicato un filtro di intervallo richieste globale. Il filtro di intervallo richieste implementa quattro filtri azioni e dei risultati (OnActionExecuting, OnActionExecuted, OnResultExecuting e OnResultExecuted). Ogni metodo del filtro nell'applicazione scrive le informazioni di traccia con il nome del filtro, il nome del controller, il nome dell'azione e il tipo del filtro. In tal caso, il tipo di filtro è un filtro di intervallo richieste. Una richiesta all'azione Index del controller Home mostra l'output seguente nel listener di traccia (finestra di debug).

Metodo del filtro

Controller

Azione

Tipo di filtro

OnActionExecuting

Home

Index

Filtro intervallo richieste

OnActionExecuted

Home

Index

Filtro intervallo richieste

OnResultExecuting

Home

Index

Filtro intervallo richieste

OnResultExecuted

Home

Index

Filtro intervallo richieste

Considerare la stessa applicazione in cui al controller semplice viene applicato un filtro azioni di traccia. Anche il controller semplice implementa i quattro filtri azioni e dei risultati. Il controller semplice contiene tre filtri, ognuno dei quali implementa i quattro metodi di azione e dei risultati. Una richiesta all'azione Details del controller Simple mostra l'output seguente nel listener di traccia:

Metodo del filtro

Controller

Azione

Tipo di filtro

OnActionExecuting

Registrazione minima

Dettagli

Controller Simple

OnActionExecuting

Registrazione minima

Dettagli

Azione traccia

OnActionExecuting

Registrazione minima

Dettagli

Intervallo richieste

OnActionExecuted

Registrazione minima

Dettagli

Intervallo richieste

OnActionExecuted

Registrazione minima

Dettagli

Azione traccia

OnActionExecuted

Registrazione minima

Dettagli

Controller Simple

OnResultExecuting

Registrazione minima

Dettagli

Controller Simple

OnResultExecuting

Registrazione minima

Dettagli

Azione traccia

OnResultExecuting

Registrazione minima

Dettagli

Intervallo richieste

OnResultExecuted

Registrazione minima

Dettagli

Intervallo richieste

OnResultExecuted

Registrazione minima

Dettagli

Azione traccia

OnResultExecuted

Registrazione minima

Dettagli

Controller Simple

Considerare ora la stessa applicazione in cui il filtro azioni di traccia imposta la proprietà del risultato su "Home/Index", come mostrato nell'esempio seguente:

if (filterContext.RouteData.Values.ContainsValue("Cancel")) {
    filterContext.Result = new RedirectResult("~/Home/Index");
    Trace.WriteLine(" Redirecting from Simple filter to /Home/Index");
}

La richiesta all'azione Details del controller Simple con il risultato annullato mostra l'output seguente nel listener di traccia:

Metodo del filtro

Controller

Azione

Tipo di filtro

OnActionExecuting

Registrazione minima

Dettagli

Controller Simple

OnActionExecuting

Registrazione minima

Dettagli

Azione traccia

OnActionExecuted

Registrazione minima

Dettagli

Controller Simple

OnResultExecuting

Registrazione minima

Dettagli

Controller Simple

OnResultExecuting

Registrazione minima

Dettagli

Azione traccia

OnResultExecuting

Registrazione minima

Dettagli

Intervallo richieste

OnResultExecuted

Registrazione minima

Dettagli

Intervallo richieste

OnResultExecuted

Registrazione minima

Dettagli

Azione traccia

OnResultExecuted

Registrazione minima

Dettagli

Controller Simple

OnActionExecuting

Home

Index

Filtro intervallo richieste

OnActionExecuted

Home

Index

Filtro intervallo richieste

OnResultExecuting

Home

Index

Filtro intervallo richieste

OnResultExecuted

Home

Index

Filtro intervallo richieste

L'esempio scaricabile per questo argomento implementa il filtro descritto in queste tabelle.

Non archiviare lo stato del filtro in un'istanza del filtro. Lo stato per singola richiesta viene archiviato in genere nella proprietà Items. Questa raccolta viene inizializzata su nessun valore per ogni richiesta e viene eliminata al completamento della richiesta. Lo stato temporaneo per singolo utente viene archiviato in genere nella sessione dell'utente. Le informazioni sullo stato dell'utente vengono spesso archiviate in un database. L'esempio scaricabile per questo argomento include un filtro di intervallo che utilizza lo stato per singola richiesta. Per informazioni sulla creazione di filtri con stato, vedere il video Advanced MVC 3.

Titolo

Descrizione

ASP.NET MVC 3 Service Location, Part 4: Filters

(Intervento di blog) Vengono descritti i filtri di ASP.NET MVC in un contesto relativo alla posizione del servizio.

AuthorizeAttribute

Viene descritto come utilizzare l'attributo Authorize per controllare l'accesso a un metodo di azione.

OutputCacheAttribute

Viene descritto come utilizzare l'attributo OutputCache per fornire la memorizzazione nella cache di output per un metodo di azione.

HandleErrorAttribute

Viene descritto come utilizzare l'attributo HandleError per gestire le eccezioni generate da un metodo di azione.

Creazione di filtri azione personalizzati

Viene descritto come implementare filtri azione personalizzati.

Procedura: creare un filtro azione personalizzato

Viene descritto come aggiungere un filtro azioni personalizzato a un'applicazione ASP.NET MVC.

Aggiunte alla community

AGGIUNGI
Mostra: