Come usare i filtri di azione in ASP.NET Core MVC

I filtri in ASP.NET Core MVC ci consentono di eseguire codice prima o dopo fasi specifiche della pipeline di elaborazione delle richieste. I diversi tipi di filtri corrispondono alle diverse fasi della pipeline, dall'autorizzazione all'esecuzione dei risultati.

Ad esempio, è possibile sfruttare i filtri di azione in ASP.NET Core MVC per eseguire codice personalizzato prima e dopo l'esecuzione di un metodo di azione. Questo articolo presenta una discussione sui filtri incorporati in ASP.NET Core MVC, sul motivo per cui sono utili e su come possiamo usare i filtri di azione nelle nostre applicazioni ASP.NET Core.

Filtri in ASP.NET Core MVC

ASP.NET Core MVC contiene molti filtri incorporati. Questi includono quanto segue:

  • ActionFilters. Questi vengono eseguiti prima e dopo l'esecuzione di un metodo di azione di un controller. 
  • AuthorizationFilters. Questi filtri vengono eseguiti all'inizio della pipeline delle richieste. Vengono utilizzati per convalidare le credenziali di un utente per verificare se l'utente è autorizzato. 
  • ResourceFilters. Questi filtri vengono eseguiti dopo l'autorizzazione e prima che si verifichi l'associazione del modello. Puoi sfruttare ResourceFilters per implementare la memorizzazione nella cache. 
  • ResultFilters. Questi filtri vengono usati per eseguire codice prima e dopo l'esecuzione di IActionResult di un metodo di azione. 
  • ExceptionFilters. Questi filtri vengono utilizzati per gestire eventuali eccezioni che si verificano nella pipeline. È possibile sfruttare gli ExceptionFilters per eseguire codice personalizzato quando si è verificata un'eccezione. 

La scelta del tipo di filtro da utilizzare dipende da ciò che si sta cercando di ottenere. Ad esempio, se stai tentando di cortocircuitare una richiesta (ad esempio, interrompere l'esecuzione di un metodo di azione e restituire un risultato prematuramente), utilizzerai un filtro di risorse. In alternativa, se stai cercando di modificare i parametri del metodo di azione e il risultato restituito dal metodo di azione, utilizzerai un filtro di azione.

La classe ActionFilterAttribute implementa le interfacce IActionFilter, IAsyncActionFilter, IResultFilter, IAsyncResultFilter e IOrderedFilter. È possibile sfruttare questa classe per implementare un filtro del metodo, un filtro del controller o un filtro globale. Lo esamineremo più avanti in questo articolo.

Creare un progetto API Web ASP.NET Core in Visual Studio 2017

Prima di tutto, creiamo un progetto API Web ASP.NET Core in Visual Studio. Se Visual Studio 2017 è attivo e in esecuzione nel sistema, attenersi alla procedura seguente per creare un progetto ASP.NET Core MVC.

  1. Avvia l'IDE di Visual Studio 2017.
  2. Fare clic su File> Nuovo> Progetto.
  3. Selezionare "Applicazione Web ASP.NET Core (.NET Core)" dall'elenco dei modelli visualizzati.
  4. Specifica un nome per il progetto.
  5. Fare clic su OK per salvare il progetto.
  6. Verrà visualizzata una nuova finestra, "Nuova applicazione Web .NET Core ...".
  7. Seleziona .NET Core come runtime e ASP.NET Core 2.1 (o versione successiva) dall'elenco a discesa in alto.
  8. Selezionare "Applicazione Web (Model-View-Controller)" come modello di progetto. 
  9. Assicurarsi che le caselle di controllo "Abilita supporto Docker" e "Configura per HTTPS" siano deselezionate. Non useremo queste funzionalità qui.
  10. Assicurati che "Nessuna autenticazione" sia selezionato. Neanche qui useremo l'autenticazione. 

Questo creerà un nuovo progetto ASP.NET Core MVC in Visual Studio. Useremo questo progetto per implementare i nostri filtri di azione nelle sezioni che seguono.

Creare un filtro di azione personalizzato in ASP.NET Core MVC

È possibile sfruttare i filtri di azione personalizzati per eseguire codice riutilizzabile prima o dopo l'esecuzione di un metodo di azione. È possibile estendere le seguenti classi di base astratte per creare filtri personalizzati. Nota che ciascuna di queste classi astratte estende la classe Attribute.

  • ActionFilterAttribute
  • ResultFilterAttribute
  • ExceptionFilterAttribute
  • ServiceFilterAttribute
  • TypeFilterAttribute

È inoltre possibile estendere l'interfaccia IActionFilter e implementarne i metodi per creare un filtro personalizzato. È possibile creare filtri sia sincroni che asincroni.

Creare un filtro di azione sincrona in ASP.NET Core MVC

Il frammento di codice seguente illustra come creare un filtro di azione sincrona estendendo l'interfaccia IActionFilter e implementando i metodi OnActionExecuting e OnActionExecuted.

classe pubblica SimpleActionFilter: IActionFilter

    {

        public void OnActionExecuting (contesto ActionExecutingContext)

        {

            // questo metodo verrà eseguito prima dell'esecuzione di un metodo di azione 

        }

        public void OnActionExecuted (contesto ActionExecutedContext)

        {

            // questo metodo verrà eseguito dopo che un metodo di azione è stato eseguito 

        }

    }

Creare un filtro di azioni asincrone in ASP.NET Core MVC

Per creare un filtro di azione asincrona, è possibile estendere l'interfaccia IAsyncActionFilter e implementare il metodo OnActionExecutionAsync come mostrato nel frammento di codice seguente.

classe pubblica SimpleAsyncActionFilter: IAsyncActionFilter

    {

        public async Task OnActionExecutionAsync (contesto ActionExecutingContext,

          ActionExecutionDelegate next)

        {

            // il codice scritto qui verrà eseguito prima dell'esecuzione di un metodo di azione 

            attende il prossimo ();

            // il codice scritto qui verrà eseguito dopo l'esecuzione di un metodo di azione 

        }

    }

Aggiungere un filtro di azione nel metodo ConfigureServices in ASP.NET Core

È possibile aggiungere filtri a diversi livelli di ambito. Questi includono l'ambito dell'azione, l'ambito del controller e l'ambito globale. Il frammento di codice seguente illustra come aggiungere un filtro nell'ambito globale. Nota come il filtro di azione personalizzato che abbiamo implementato sopra viene aggiunto alla raccolta di filtri nel metodo ConfigureServices della classe Startup. Notare che il filtro viene aggiunto alla raccolta di filtri per istanza.

services.AddMvc (opzioni =>

            {

                options.Filters.Add (new SimpleAsyncActionFilter ());

            }) SetCompatibilityVersion (CompatibilityVersion.Version_2_1);

Puoi anche aggiungere il filtro in base al tipo come mostrato nello snippet di codice di seguito.

services.AddMvc (opzioni =>

            {

                options.Filters.Add (typeof (SimpleAsyncActionFilter));

            }) SetCompatibilityVersion (CompatibilityVersion.Version_2_1);

I filtri consentono di eseguire il codice prima o dopo un punto particolare nella pipeline di elaborazione delle richieste. Uno dei nuovi grandi miglioramenti nei filtri di azione in ASP.NET Core MVC è la possibilità di specificare l'ordine di esecuzione del filtro nella pipeline delle richieste HTTP. Esamineremo questa e molte altre funzionalità dei filtri in ASP.NET Core MVC in un prossimo post.