Sobes.tech
Middle+
112
questionbank

Как вы применяете фильтры в конвейерах (pipeline) в C#? Можете ли вы привести примеры их использования?

Answer from AI

sobes.tech AI

Фильтры в конвейерах C# используются для перехвата и вмешательства на различных этапах обработки запроса или выполнения задачи. Применительно к веб-приложениям на ASP.NET Core, они позволяют добавлять логику до, после или во время выполнения методов действий контроллеров, а также на других уровнях обработки запросов.

Примеры использования фильтров в ASP.NET Core:

  1. Аутентификация и Авторизация (Authentication/Authorization Filters): Определяют, авторизован ли пользователь выполнять определенное действие.

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

    // Пример фильтра ресурсов для кэширования
    public class CacheResourceFilter : IResourceFilter
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // Логика до выполнения Action Method
        }
    
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            // Логика после выполнения Action Method, но до записи ответа
        }
    }
    
  3. Фильтры действий (Action Filters): Выполняются до и после выполнения метода действия контроллера. Подходят для валидации данных, логирования или модификации параметров и результатов.

    // Пример Action Filter для логирования
    public class LogActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // Логика перед выполнением Action Method
            Console.WriteLine($"Executing action: {context.ActionDescriptor.DisplayName}");
        }
    
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Логика после выполнения Action Method
            Console.WriteLine($"Executed action: {context.ActionDescriptor.DisplayName}");
        }
    }
    
    // Применение Action Filter к методу контроллера
    [LogActionFilter]
    public IActionResult About()
    {
        return View();
    }
    
  4. Фильтры исключений (Exception Filters): Обрабатывают необработанные исключения, возникающие в ходе выполнения Action Method или других фильтров.

    // Пример Exception Filter для обработки ошибок
    public class CustomExceptionFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            // Логика обработки исключения
            context.Result = new ContentResult()
            {
                Content = "An error occurred.",
                StatusCode = 500
            };
            context.ExceptionHandled = true; // Указываем, что исключение обработано
        }
    }
    
    // Применение Exception Filter к контроллеру
    [CustomExceptionFilter]
    public class ErrorController : Controller
    {
        public IActionResult Index()
        {
            throw new Exception("Something went wrong!");
        }
    }
    
  5. Фильтры результатов (Result Filters): Выполняются до и после выполнения метода результата действия (например, до или после выполнения ViewResult, JsonResult и т. п.).

    // Пример Result Filter для модификации результата
    public class CustomResultFilter : IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            // Логика перед выполнением Result Method
            Console.WriteLine($"Executing result type: {context.Result.GetType().Name}");
        }
    
        public void OnResultExecuted(ResultExecutedContext context)
        {
            // Логика после выполнения Result Method
            Console.WriteLine($"Executed result type: {context.Result.GetType().Name}");
        }
    }
    

Фильтры могут быть применены глобально (для всех запросов), на уровне контроллера или на уровне конкретного метода действия. Порядок их выполнения в конвейере определен их типом.