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