Фильтры (Filters) в ASP.NET Core — это мощный механизм для обработки запросов на различных этапах жизненного цикла запроса. Они позволяют добавлять дополнительную логику до или после выполнения действия контроллера, а также изменять или исключать выполнение определенных частей приложения. Фильтры могут быть использованы для таких задач, как обработка исключений, авторизация, логирование, изменение данных и многое другое.
ASP.NET Core предоставляет несколько типов фильтров, каждый из которых отвечает за разные аспекты обработки запросов:
- Action filters — фильтры, которые выполняются до и после выполнения действия контроллера.
- Exception filters — фильтры для обработки исключений, возникающих в процессе обработки запроса.
- Authorization filters — фильтры для авторизации запросов.
- Result filters — фильтры, которые выполняются после того, как действие контроллера вернуло результат.
- Resource filters — фильтры, которые выполняются до выполнения действия и фильтруют запросы на уровне ресурсов.
Типы фильтров
Action Filters
Action filters выполняются до и после вызова действия контроллера. Они позволяют добавлять логику, которая должна быть выполнена до или после того, как выполнится метод контроллера.
Пример использования ActionFilter
:
public class MyActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
// Логика, выполняемая до выполнения действия
}
public void OnActionExecuted(ActionExecutedContext context)
{
// Логика, выполняемая после выполнения действия
}
}
Этот фильтр можно применить к контроллеру или отдельному методу с помощью атрибута:
[MyActionFilter]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
Exception Filters
Exception filters используются для обработки исключений, которые могут возникнуть при выполнении действия контроллера. Это фильтры, которые позволяют централизованно обрабатывать ошибки, не создавая избыточного кода в каждом действии.
Пример использования IExceptionFilter
:
public class MyExceptionFilter : IExceptionFilter
{
public void OnException(ExceptionContext context)
{
// Логика обработки исключений
context.Result = new JsonResult(new { error = "Произошла ошибка" });
context.ExceptionHandled = true;
}
}
Authorization Filters
Authorization filters выполняются до других фильтров и обеспечивают авторизацию запроса. Эти фильтры используются для проверки прав доступа пользователя, прежде чем выполнение будет продолжено.
Пример использования IAuthorizationFilter
:
public class MyAuthorizationFilter : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
// Логика авторизации
if (!context.HttpContext.User.Identity.IsAuthenticated)
{
context.Result = new UnauthorizedResult();
}
}
}
Result Filters
Result filters выполняются после того, как действие контроллера завершилось и вернуло результат. Эти фильтры могут использоваться для манипуляции с результатом перед тем, как он будет отправлен пользователю.
Пример использования IResultFilter
:
public class MyResultFilter : IResultFilter
{
public void OnResultExecuting(ResultExecutingContext context)
{
// Логика перед отправкой результата
}
public void OnResultExecuted(ResultExecutedContext context)
{
// Логика после отправки результата
}
}
Resource Filters
Resource filters выполняются до выполнения действия и могут быть использованы для фильтрации запросов на уровне ресурсов, например, для кэширования или проверки предварительных условий.
Пример использования IResourceFilter
:
public class MyResourceFilter : IResourceFilter
{
public void OnResourceExecuting(ResourceExecutingContext context)
{
// Логика до выполнения действия
}
public void OnResourceExecuted(ResourceExecutedContext context)
{
// Логика после выполнения действия
}
}
Применение фильтров
Фильтры могут быть применены различными способами. Один из способов — это использование атрибутов на контроллерах или действиях.
Пример применения фильтра на уровне контроллера:
[MyActionFilter]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
Если фильтр должен применяться ко всему приложению, то его можно зарегистрировать в методе ConfigureServices
класса Startup
:
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<MyActionFilter>();
services.AddControllersWithViews(options =>
{
options.Filters.Add(typeof(MyActionFilter));
});
}
Регистрация и порядок фильтров
При использовании нескольких фильтров важно учитывать их порядок выполнения. В ASP.NET Core фильтры выполняются в следующем порядке:
- Authorization filters
- Resource filters
- Action filters
- Result filters
- Exception filters
Порядок выполнения фильтров можно настроить, если необходимо изменить стандартный процесс. Фильтры могут быть зарегистрированы в любой последовательности, но их выполнение будет зависеть от их типа.
Фильтры в ASP.NET Core — это мощный механизм, который помогает внедрить дополнительную логику на различных этапах обработки запроса. С их помощью можно эффективно управлять процессами авторизации, логирования, обработки исключений и даже манипулирования результатами. Понимание различных типов фильтров и их правильное использование помогает улучшить структуру приложения и повысить его гибкость.