Как вы применяете фильтры в конвейерах (pipeline) в C#? Можете ли вы привести примеры их использования?
Answer from AI
sobes.tech AI
Фильтры в конвейерах C# используются для перехвата и вмешательства на различных этапах обработки запроса или выполнения задачи. Применительно к веб-приложениям на ASP.NET Core, они позволяют добавлять логику до, после или во время выполнения методов действий контроллеров, а также на других уровнях обработки запросов.
Примеры использования фильтров в ASP.NET Core:
-
Аутентификация и Авторизация (Authentication/Authorization Filters): Определяют, авторизован ли пользователь выполнять определенное действие.
// Пример атрибута Authorize [Authorize] public class HomeController : Controller { public IActionResult Index() { return View(); } } -
Фильтры ресурсов (Resource Filters): Выполняются первыми после фильтров авторизации. Могут выполнять кэширование или прерывать конвейер.
// Пример фильтра ресурсов для кэширования public class CacheResourceFilter : IResourceFilter { public void OnResourceExecuting(ResourceExecutingContext context) { // Логика до выполнения Action Method } public void OnResourceExecuted(ResourceExecutedContext context) { // Логика после выполнения Action Method, но до записи ответа } } -
Фильтры действий (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(); } -
Фильтры исключений (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!"); } } -
Фильтры результатов (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}"); } }
Фильтры могут быть применены глобально (для всех запросов), на уровне контроллера или на уровне конкретного метода действия. Порядок их выполнения в конвейере определен их типом.