Sobes.tech
Middle+

Come si applicano i filtri nelle pipeline in C#? Puoi fornire esempi di utilizzo?

sobes.tech AI

Risposta dell'AI

I filtri nei pipeline di C# vengono utilizzati per intercettare e intervenire in diverse fasi dell'elaborazione di una richiesta o dell'esecuzione di un task. Nelle applicazioni web ASP.NET Core, consentono di aggiungere logica prima, dopo o durante l'esecuzione dei metodi di azione dei controller, nonché a altri livelli di elaborazione delle richieste.

Esempi di utilizzo dei filtri in ASP.NET Core:

  1. Filtri di Autenticazione e Autorizzazione: Determinano se un utente è autorizzato a eseguire una determinata azione.

    // Esempio di attributo Authorize
    [Authorize]
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
    
  2. Filtri delle risorse: Vengono eseguiti per primi dopo i filtri di autorizzazione. Possono eseguire caching o interrompere il pipeline.

    // Esempio di filtro risorsa per caching
    public class CacheResourceFilter : IResourceFilter
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // Logica prima dell'esecuzione dell'azione
        }
    
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            // Logica dopo l'esecuzione dell'azione, prima di scrivere la risposta
        }
    }
    
  3. Filtri di azione: Vengono eseguiti prima e dopo il metodo di azione del controller. Sono utili per validare dati, fare logging o modificare parametri e risultati.

    // Esempio di filtro di azione per il logging
    public class LogActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // Logica prima dell'esecuzione dell'azione
            Console.WriteLine($"Esecuzione azione: {context.ActionDescriptor.DisplayName}");
        }
    
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Logica dopo l'esecuzione dell'azione
            Console.WriteLine($"Azione eseguita: {context.ActionDescriptor.DisplayName}");
        }
    }
    
    // Applicazione del filtro di azione a un metodo
    [LogActionFilter]
    public IActionResult About()
    {
        return View();
    }
    
  4. Filtri di eccezione: Gestiscono le eccezioni non gestite che si verificano durante l'esecuzione del metodo di azione o altri filtri.

    // Esempio di filtro di eccezione per la gestione degli errori
    public class CustomExceptionFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            // Logica di gestione dell'eccezione
            context.Result = new ContentResult()
            {
                Content = "Si è verificato un errore.",
                StatusCode = 500
            };
            context.ExceptionHandled = true; // Indica che l'eccezione è stata gestita
        }
    }
    
    // Applicazione del filtro di eccezione a un controller
    [CustomExceptionFilter]
    public class ErrorController : Controller
    {
        public IActionResult Index()
        {
            throw new Exception("Qualcosa è andato storto!");
        }
    }
    
  5. Filtri di risultato: Vengono eseguiti prima e dopo l'esecuzione del metodo di risultato (ad esempio, prima o dopo l'esecuzione di ViewResult, JsonResult, ecc.).

    // Esempio di filtro di risultato per modificare il risultato
    public class CustomResultFilter : IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            // Logica prima dell'esecuzione del metodo di risultato
            Console.WriteLine($"Tipo di risultato in esecuzione: {context.Result.GetType().Name}");
        }
    
        public void OnResultExecuted(ResultExecutedContext context)
        {
            // Logica dopo l'esecuzione del metodo di risultato
            Console.WriteLine($"Tipo di risultato eseguito: {context.Result.GetType().Name}");
        }
    }
    

I filtri possono essere applicati globalmente (per tutte le richieste), a livello di controller o a livello di metodo di azione specifico. L'ordine di esecuzione nel pipeline è determinato dal loro tipo.