← Назад к вопросам

Какие знаешь фильтры MVC?

1.7 Middle🔥 192 комментариев
#ASP.NET и Web API

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Фильтры в ASP.NET MVC: полный обзор

Фильтры (Filters) в ASP.NET MVC — это механизм для выполнения пользовательской логики на различных этапах обработки HTTP-запроса в конвейере MVC. Они позволяют инкапсулировать переиспользуемую функциональность (авторизацию, логирование, обработку исключений и т.д.) без дублирования кода в контроллерах. Все фильтры реализуют интерфейс IActionFilter или его специализированные производные.

Основные типы фильтров MVC

1. Фильтры авторизации (Authorization Filters)

Используются для проверки прав доступа пользователя. Выполняются до всех остальных фильтров и методов действия.

public class CustomAuthAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            filterContext.Result = new HttpUnauthorizedResult();
        }
        base.OnAuthorization(filterContext);
    }
}

2. Фильтры действий (Action Filters)

Выполняются до и после выполнения метода действия. Наиболее часто используемый тип.

public class LogActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        // Логирование перед выполнением действия
        Debug.WriteLine($"Action {context.ActionDescriptor.ActionName} started at {DateTime.Now}");
        base.OnActionExecuting(context);
    }

    public override void OnActionExecuted(ActionExecutedContext context)
    {
        // Логирование после выполнения действия
        Debug.WriteLine($"Action {context.ActionDescriptor.ActionName} completed at {DateTime.Now}");
        base.OnActionExecuted(context);
    }
}

3. Фильтры результатов (Result Filters)

Выполняются до и после выполнения результата действия (например, рендеринга представления).

public class CompressResultAttribute : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext context)
    {
        var response = context.HttpContext.Response;
        response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
        response.AppendHeader("Content-encoding", "gzip");
        base.OnResultExecuting(context);
    }
}

4. Фильтры исключений (Exception Filters)

Обрабатывают необработанные исключения, возникшие в процессе выполнения действия.

public class CustomExceptionFilter : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        if (!filterContext.ExceptionHandled)
        {
            // Логирование исключения
            Logger.LogError(filterContext.Exception);
            
            // Установка кастомного результата
            filterContext.Result = new ViewResult
            {
                ViewName = "CustomError",
                ViewData = new ViewDataDictionary(filterContext.Controller.ViewData)
                {
                    Model = filterContext.Exception.Message
                }
            };
            filterContext.ExceptionHandled = true;
        }
        base.OnException(filterContext);
    }
}

5. Фильтры аутентификации (Authentication Filters)

Введены в MVC 5 для кастомной логики аутентификации.

public class CustomAuthFilter : IAuthenticationFilter
{
    public void OnAuthentication(AuthenticationContext filterContext)
    {
        // Проверка аутентификации
        if (filterContext.HttpContext.Session["UserId"] == null)
        {
            filterContext.Result = new HttpUnauthorizedResult();
        }
    }

    public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
    {
        // Дополнительные проверки перед вызовом ActionResult
    }
}

Порядок выполнения фильтров

Очередность выполнения фильтров в конвейере MVC:

  1. Фильтры авторизации (выполняются глобально, затем на уровне контроллера, затем на уровне действия)
  2. Фильтры действий (OnActionExecuting)
  3. Выполнение метода действия контроллера
  4. Фильтры действий (OnActionExecuted)
  5. Фильтры результатов (OnResultExecuting)
  6. Выполнение результата (рендеринг View)
  7. Фильтры результатов (OnResultExecuted)

При возникновении исключения управление передается фильтрам исключений.

Способы применения фильтров

1. Атрибуты на уровне действия

public class HomeController : Controller
{
    [Authorize]
    [LogActionFilter]
    public ActionResult Index()
    {
        return View();
    }
}

2. Атрибуты на уровне контроллера (применяются ко всем действиям контроллера)

[CustomAuth]
public class AdminController : Controller
{
    // Все действия требуют авторизации
}

3. Глобальная регистрация (в файле FilterConfig.cs)

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute()); // Глобальная обработка ошибок
        filters.Add(new RequireHttpsAttribute()); // Требование HTTPS для всех действий
        filters.Add(new LogActionFilter()); // Глобальное логирование
    }
}

Кастомные фильтры

Для создания собственного фильтра необходимо:

  1. Унаследоваться от ActionFilterAttribute или реализовать соответствующий интерфейс
  2. Переопределить нужные методы
public class TimingFilter : ActionFilterAttribute
{
    private Stopwatch _stopwatch;

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        _stopwatch = Stopwatch.StartNew();
        base.OnActionExecuting(context);
    }

    public override void OnActionExecuted(ActionExecutedContext context)
    {
        _stopwatch.Stop();
        context.HttpContext.Response.Headers.Add(
            "X-Action-Duration", 
            _stopwatch.ElapsedMilliseconds.ToString()
        );
        base.OnActionExecuted(context);
    }
}

Практические сценарии использования

  1. Кеширование результатов — с помощью OutputCacheAttribute
  2. Валидация моделей — автоматическая проверка ModelState.IsValid
  3. Логирование аудита — запись действий пользователей
  4. Локализация — установка культуры на основе запроса
  5. Компрессия ответов — уменьшение размера передаваемых данных
  6. Защита от CSRF — с помощью ValidateAntiForgeryTokenAttribute

Фильтры в MVC предоставляют мощный механизм для реализации сквозной функциональности (cross-cutting concerns), соблюдая принцип единой ответственности (Single Responsibility Principle) и уменьшая дублирование кода. Правильное использование фильтров значительно повышает поддерживаемость и безопасность приложений.

Какие знаешь фильтры MVC? | PrepBro