Sobes.tech
Middle+

Cum aplicați filtre în pipeline-urile din C#? Puteți oferi exemple de utilizare?

sobes.tech AI

Răspuns de la AI

Filtrele din pipeline-urile C# sunt utilizate pentru a intercepta și interveni în diferite etape ale procesării solicitării sau executării unei sarcini. În aplicațiile web ASP.NET Core, acestea permit adăugarea de logică înainte, după sau în timpul executării metodelor acțiunilor controlerelor, precum și la alte niveluri de procesare a solicitărilor.

Exemple de utilizare a filtrelor în ASP.NET Core:

  1. Autentificare și Autorizare (Filtre de Autentificare/Autorizare): Determină dacă utilizatorul are permisiunea de a executa o anumită acțiune.

    // Exemplu de atribut Authorize
    [Authorize]
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
    
  2. Filtre de resurse (Resource Filters): Sunt executate primele după filtrele de autorizare. Pot efectua caching sau pot întrerupe pipeline-ul.

    // Exemplu de filtru de resurse pentru caching
    public class CacheResourceFilter : IResourceFilter
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // Logică înainte de executarea metodei acțiune
        }
    
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            // Logică după executarea metodei acțiune, dar înainte de scrierea răspunsului
        }
    }
    
  3. Filtre de acțiune (Action Filters): Sunt executate înainte și după metoda acțiunii controlerului. Pot fi utilizate pentru validarea datelor, jurnalizare sau modificarea parametrilor și rezultatelor.

    // Exemplu de filtru de acțiune pentru jurnalizare
    public class LogActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // Logică înainte de executarea acțiunii
            Console.WriteLine($"Executare acțiune: {context.ActionDescriptor.DisplayName}");
        }
    
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Logică după executarea acțiunii
            Console.WriteLine($"Acțiune executată: {context.ActionDescriptor.DisplayName}");
        }
    }
    
    // Aplicarea filtrului de acțiune la o metodă de controler
    [LogActionFilter]
    public IActionResult About()
    {
        return View();
    }
    
  4. Filtre de excepții (Exception Filters): Gestionează excepțiile necontrolate care apar în timpul executării metodei acțiune sau a altor filtre.

    // Exemplu de filtru de excepții pentru gestionarea erorilor
    public class CustomExceptionFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            // Logică de gestionare a excepției
            context.Result = new ContentResult()
            {
                Content = "A apărut o eroare.",
                StatusCode = 500
            };
            context.ExceptionHandled = true; // Indică faptul că excepția a fost gestionată
        }
    }
    
    // Aplicarea filtrului de excepții la un controler
    [CustomExceptionFilter]
    public class ErrorController : Controller
    {
        public IActionResult Index()
        {
            throw new Exception("Ceva nu a mers bine!");
        }
    }
    
  5. Filtre de rezultate (Result Filters): Sunt executate înainte și după metoda rezultatului acțiunii (de exemplu, înainte sau după executarea ViewResult, JsonResult etc.).

    // Exemplu de filtru de rezultat pentru modificarea rezultatului
    public class CustomResultFilter : IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            // Logică înainte de executarea metodei rezultat
            Console.WriteLine($"Tip rezultat executat: {context.Result.GetType().Name}");
        }
    
        public void OnResultExecuted(ResultExecutedContext context)
        {
            // Logică după executarea metodei rezultat
            Console.WriteLine($"Tip rezultat executat: {context.Result.GetType().Name}");
        }
    }
    

Filtrele pot fi aplicate global (pentru toate solicitările), la nivel de controler sau la nivel de metodă specifică. Ordinea lor de executare în pipeline este determinată de tipul lor.