Sobes.tech
Middle+

Jak používáte filtry v pipelinech v C#? Můžete uvést příklady jejich použití?

sobes.tech AI

Odpověď od AI

Filtry v C# pipech jsou používány k zachycení a zásahu v různých fázích zpracování požadavku nebo vykonávání úkolu. V webových aplikacích ASP.NET Core umožňují přidávat logiku před, po nebo během vykonávání metod akcí kontrolerů, stejně jako na jiných úrovních zpracování požadavků.

Příklady použití filtrů v ASP.NET Core:

  1. Autentizace a autorizace (Filtry autentifikace/autorizace): Určují, zda má uživatel oprávnění vykonat danou akci.

    // Příklad atributu Authorize
    [Authorize]
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
    
  2. Filtry zdrojů (Resource Filters): Jsou vykonávány jako první po filtrech autorizace. Mohou provádět cachování nebo přerušit pipeline.

    // Příklad filtru zdrojů pro cachování
    public class CacheResourceFilter : IResourceFilter
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // Logika před vykonáním akční metody
        }
    
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            // Logika po vykonání akční metody, ale před zápisem odpovědi
        }
    }
    
  3. Filtry akcí (Action Filters): Jsou vykonávány před a po vykonání metody akce kontroleru. Vhodné pro validaci dat, logování nebo úpravu parametrů a výsledků.

    // Příklad filtru pro logování
    public class LogActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // Logika před vykonáním akce
            Console.WriteLine($"Vykonávám akci: {context.ActionDescriptor.DisplayName}");
        }
    
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Logika po vykonání akce
            Console.WriteLine($"Akce provedena: {context.ActionDescriptor.DisplayName}");
        }
    }
    
    // Použití filtru akce na metodě kontroleru
    [LogActionFilter]
    public IActionResult About()
    {
        return View();
    }
    
  4. Filtry výjimek (Exception Filters): Zpracovávají neošetřené výjimky, které vzniknou během vykonávání metody akce nebo jiných filtrů.

    // Příklad filtru výjimek pro zpracování chyb
    public class CustomExceptionFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            // Logika zpracování výjimky
            context.Result = new ContentResult()
            {
                Content = "Došlo k chybě.",
                StatusCode = 500
            };
            context.ExceptionHandled = true; // Označuje, že výjimka byla zpracována
        }
    }
    
    // Použití filtru výjimek na kontroleru
    [CustomExceptionFilter]
    public class ErrorController : Controller
    {
        public IActionResult Index()
        {
            throw new Exception("Něco se pokazilo!");
        }
    }
    
  5. Filtry výsledků (Result Filters): Jsou vykonávány před a po vykonání metody výsledku akce (například před nebo po vykonání ViewResult, JsonResult apod.).

    // Příklad filtru výsledku pro modifikaci výsledku
    public class CustomResultFilter : IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            // Logika před vykonáním metody výsledku
            Console.WriteLine($"Typ výsledku: {context.Result.GetType().Name}");
        }
    
        public void OnResultExecuted(ResultExecutedContext context)
        {
            // Logika po vykonání metody výsledku
            Console.WriteLine($"Typ výsledku: {context.Result.GetType().Name}");
        }
    }
    

Filtry lze aplikovat globálně (pro všechny požadavky), na úrovni kontroleru nebo na úrovni konkrétní metody. Pořadí jejich vykonávání v pipeline je určeno jejich typem.