Фильтры (Filters) в ASP.NET Core C#

Фильтры (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 фильтры выполняются в следующем порядке:

  1. Authorization filters
  2. Resource filters
  3. Action filters
  4. Result filters
  5. Exception filters

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


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