Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Фильтры в 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:
- Фильтры авторизации (выполняются глобально, затем на уровне контроллера, затем на уровне действия)
- Фильтры действий (OnActionExecuting)
- Выполнение метода действия контроллера
- Фильтры действий (OnActionExecuted)
- Фильтры результатов (OnResultExecuting)
- Выполнение результата (рендеринг View)
- Фильтры результатов (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()); // Глобальное логирование
}
}
Кастомные фильтры
Для создания собственного фильтра необходимо:
- Унаследоваться от
ActionFilterAttributeили реализовать соответствующий интерфейс - Переопределить нужные методы
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);
}
}
Практические сценарии использования
- Кеширование результатов — с помощью
OutputCacheAttribute - Валидация моделей — автоматическая проверка
ModelState.IsValid - Логирование аудита — запись действий пользователей
- Локализация — установка культуры на основе запроса
- Компрессия ответов — уменьшение размера передаваемых данных
- Защита от CSRF — с помощью
ValidateAntiForgeryTokenAttribute
Фильтры в MVC предоставляют мощный механизм для реализации сквозной функциональности (cross-cutting concerns), соблюдая принцип единой ответственности (Single Responsibility Principle) и уменьшая дублирование кода. Правильное использование фильтров значительно повышает поддерживаемость и безопасность приложений.