Sobes.tech
Middle+

Ako používate filtre v pipeline-och v C#? Môžete uviesť príklady ich použitia?

sobes.tech AI

Odpoveď od AI

Filtre v pipeline v C# sa používajú na zachytávanie a zasahovanie na rôznych etapách spracovania požiadavky alebo vykonávania úlohy. V súvislosti s webovými aplikáciami na ASP.NET Core umožňujú pridávať logiku pred, po alebo počas vykonávania metód akcií kontrolérov, ako aj na iných úrovniach spracovania požiadaviek.

Príklady použitia filtrov v ASP.NET Core:

  1. Autentifikácia a autorizácia (Authentication/Authorization Filters): Určujú, či je používateľ oprávnený vykonať určitú akciu.

    // Príklad atribútu Authorize
    [Authorize]
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
    
  2. Filtre zdrojov (Resource Filters): Sú vykonávané ako prvé po filtroch autorizácie. Môžu vykonávať cacheovanie alebo prerušiť pipeline.

    // Príklad filtra zdrojov pre cacheovanie
    public class CacheResourceFilter : IResourceFilter
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // Logika pred vykonaním akcie
        }
    
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            // Logika po vykonaní akcie, ale pred zápisom odpovede
        }
    }
    
  3. Filtre akcií (Action Filters): Sú vykonávané pred a po vykonaní metódy akcie kontroléra. Sú vhodné na validáciu dát, logovanie alebo modifikáciu parametrov a výsledkov.

    // Príklad filtra akcie na logovanie
    public class LogActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // Logika pred vykonaním akcie
            Console.WriteLine($"Executing action: {context.ActionDescriptor.DisplayName}");
        }
    
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Logika po vykonaní akcie
            Console.WriteLine($"Executed action: {context.ActionDescriptor.DisplayName}");
        }
    }
    
    // Použitie filtra akcie na metóde kontroléra
    [LogActionFilter]
    public IActionResult About()
    {
        return View();
    }
    
  4. Filtre výnimiek (Exception Filters): Spracovávajú neošetrené výnimky, ktoré vzniknú počas vykonávania metódy akcie alebo iných filtrov.

    // Príklad filtra výnimiek na spracovanie chýb
    public class CustomExceptionFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            // Logika spracovania výnimky
            context.Result = new ContentResult()
            {
                Content = "An error occurred.",
                StatusCode = 500
            };
            context.ExceptionHandled = true; // Označujeme, že výnimka bola spracovaná
        }
    }
    
    // Použitie filtra výnimiek na kontroléri
    [CustomExceptionFilter]
    public class ErrorController : Controller
    {
        public IActionResult Index()
        {
            throw new Exception("Something went wrong!");
        }
    }
    
  5. Filtre výsledkov (Result Filters): Sú vykonávané pred a po vykonaní metódy výsledku akcie (napríklad pred alebo po vykonaní ViewResult, JsonResult a pod.).

    // Príklad filtra výsledku na modifikáciu výsledku
    public class CustomResultFilter : IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            // Logika pred vykonaním metódy výsledku
            Console.WriteLine($"Executing result type: {context.Result.GetType().Name}");
        }
    
        public void OnResultExecuted(ResultExecutedContext context)
        {
            // Logika po vykonaní metódy výsledku
            Console.WriteLine($"Executed result type: {context.Result.GetType().Name}");
        }
    }
    

Filtre môžu byť aplikované globálne (pre všetky požiadavky), na úrovni kontroléra alebo na úrovni konkrétnej metódy akcie. Poradie ich vykonávania v pipeline je určené ich typom.