Sobes.tech
Middle+

Hogyan alkalmazza a szűrőket a pipeline-okban C#-ban? Tudna példákat adni a használatukra?

sobes.tech MI

Válasz az MI-től

A C#-pipeline-okban a szűrők (filterek) különböző szakaszokban közbeavatkoznak és beavatkoznak a kérés feldolgozásába vagy a feladat végrehajtásába. Az ASP.NET Core webalkalmazásokban lehetővé teszik logika hozzáadását az akciómetódusok végrehajtása előtt, után vagy közben, valamint más kérésfeldolgozási szinteken.

Az ASP.NET Core-ban a szűrők használatának példái:

  1. Hitelesítés és jogosultság (Authentication/Authorization Filters): Meghatározzák, hogy a felhasználó jogosult-e egy adott művelet végrehajtására.

    // Authorize attribútum példa
    [Authorize]
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
    
  2. Erőforrás szűrők (Resource Filters): Elsőként futnak az engedélyezési szűrők után. Cache-elést végezhetnek vagy megszakíthatják a pipeline-t.

    // Erőforrás szűrő cache-eléshez példa
    public class CacheResourceFilter : IResourceFilter
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // Logika az Action metódus végrehajtása előtt
        }
    
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            // Logika az Action metódus végrehajtása után, de a válasz írása előtt
        }
    }
    
  3. Akció szűrők (Action Filters): A kontrollerek akciómetódusának végrehajtása előtt és után futnak. Ideális adatok validálására, naplózásra vagy paraméterek és eredmények módosítására.

    // Naplózó Action Filter példa
    public class LogActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // Az akció végrehajtása előtt
            Console.WriteLine($"Akció végrehajtása: {context.ActionDescriptor.DisplayName}");
        }
    
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Az akció végrehajtása után
            Console.WriteLine($"Akció végrehajtva: {context.ActionDescriptor.DisplayName}");
        }
    }
    
    // Action Filter alkalmazása egy kontrollermetódusra
    [LogActionFilter]
    public IActionResult About()
    {
        return View();
    }
    
  4. Kivétel szűrők (Exception Filters): Kezelik a nem kezelt kivételeket, amelyek az akciómetódus vagy más szűrők végrehajtása során keletkeznek.

    // Kivétel szűrő példa hibakezeléshez
    public class CustomExceptionFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            // Hibakezelő logika
            context.Result = new ContentResult()
            {
                Content = "Hiba történt.",
                StatusCode = 500
            };
            context.ExceptionHandled = true; // Jelezve, hogy a kivétel kezelve lett
        }
    }
    
    // Exception Filter alkalmazása egy kontrolleren
    [CustomExceptionFilter]
    public class ErrorController : Controller
    {
        public IActionResult Index()
        {
            throw new Exception("Valami baj történt!");
        }
    }
    
  5. Eredmény szűrők (Result Filters): A művelet eredményének végrehajtása előtt és után futnak (pl. ViewResult, JsonResult stb. végrehajtása előtt vagy után).

    // Eredmény módosítására szolgáló Result Filter példa
    public class CustomResultFilter : IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            // Logika az eredmény végrehajtása előtt
            Console.WriteLine($"Eredmény típusa: {context.Result.GetType().Name}");
        }
    
        public void OnResultExecuted(ResultExecutedContext context)
        {
            // Logika az eredmény végrehajtása után
            Console.WriteLine($"Végrehajtott eredmény típusa: {context.Result.GetType().Name}");
        }
    }
    

A szűrőket globálisan (minden kérésre), kontrollerszinten vagy konkrét metódus szinten lehet alkalmazni. Az ő végrehajtási sorrendjük típusuktól függ.