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:
-
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(); } } -
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 } } -
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(); } -
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!"); } } -
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.