Sobes.tech
Middle+

Kako primenjujete filtere u pipeline-ima u C#? Možete li navesti primere njihove upotrebe?

sobes.tech АИ

Одговор од АИ

Филтери у C# pipeline-има се користе за пресретање и интервенцију у различитим фазама обраде захтева или извршавања задатка. У ASP.NET Core веб апликацијама, они омогућавају додавање логике пре, после или током извршавања метода контролера, као и на другим нивоима обраде захтева.

Примери коришћења филтера у ASP.NET Core:

  1. Аутентификација и Ауторизација (Authentication/Authorization Filters): Одређују да ли је корисник овлашћен да изврши одређену акцију.

    // Пример атрибута Authorize
    [Authorize]
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
    
  2. Филтери ресурса (Resource Filters): Извршавају се први након филтера ауторизације. Могу вршити кеширање или прекинути pipeline.

    // Пример Resource филтра за кеширање
    public class CacheResourceFilter : IResourceFilter
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // Логика пре извршавања методе акције
        }
    
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            // Логика након извршавања методе акције, али пре записивања одговора
        }
    }
    
  3. Филтери акција (Action Filters): Извршавају се пре и после извршавања методе акције контролера. Погодни су за валидацију података, логовање или модификацију параметара и резултата.

    // Пример филтра за логовање
    public class LogActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // Логика пре извршавања акције
            Console.WriteLine($"Извршавање акције: {context.ActionDescriptor.DisplayName}");
        }
    
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Логика након извршавања акције
            Console.WriteLine($"Акција извршена: {context.ActionDescriptor.DisplayName}");
        }
    }
    
    // Примена филтра акције на методу контролера
    [LogActionFilter]
    public IActionResult About()
    {
        return View();
    }
    
  4. Филтери изузетака (Exception Filters): Обрађују необрађене изузетке који настану током извршавања методе акције или других филтера.

    // Пример Exception филтра за обраду грешака
    public class CustomExceptionFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            // Логика обраде изузетка
            context.Result = new ContentResult()
            {
                Content = "Дошло је до грешке.",
                StatusCode = 500
            };
            context.ExceptionHandled = true; // Наводи да је изузетак обрађен
        }
    }
    
    // Примена Exception филтра на контролер
    [CustomExceptionFilter]
    public class ErrorController : Controller
    {
        public IActionResult Index()
        {
            throw new Exception("Нешто није у реду!");
        }
    }
    
  5. Филтери резултата (Result Filters): Извршавају се пре и после извршавања методе резултата акције (нпр. пре или после извршавања ViewResult, JsonResult итд.).

    // Пример Result филтра за модификацију резултата
    public class CustomResultFilter : IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            // Логика пре извршавања метода резултата
            Console.WriteLine($"Тип резултата: {context.Result.GetType().Name}");
        }
    
        public void OnResultExecuted(ResultExecutedContext context)
        {
            // Логика након извршавања метода резултата
            Console.WriteLine($"Тип извршеног резултата: {context.Result.GetType().Name}");
        }
    }
    

Филтри могу бити примењени глобално (за све захтеве), на нивоу контролера или на нивоу конкретне методе. Поредак њиховог извршавања у pipeline-у одређује њихов тип.