Фильтры действий

— это фильтры, которые могут применяться для любых целей. Встроенный интерфейс для создания фильтра данного типа, IActionFilter, показан в примере ниже:
namespace System.Web.Mvc < public interface IActionFilter < void OnActionExecuting(ActionExecutingContext filterContext); void OnActionExecuted(ActionExecutedContext filterContext); >>
В интерфейсе IActionFilter определены два метода. Инфраструктура ASP.NET MVC Framework вызывает метод OnActionExecuting() перед обращением к методу действия, а метод OnActionExecuted() — после обращения к методу действия.
Реализация метода OnActionExecuting()
Метод OnActionExecuting() вызывается перед обращением к методу действия. Этой возможностью можно воспользоваться для инспектирования запроса и принятия решения об отмене запроса, модификации запроса или о начале некоторой деятельности, которая включает вызов действия. Данный метод принимает в качестве параметра объект ActionExecutingContext, который является подклассом класса ControllerContext и определяет два дополнительных свойства:
ActionDescriptor
Предоставляет детали о методе действия
Result
Результат для метода действия: фильтр может отменить запрос, установив для этого свойства значение, отличное от null
Фильтр можно использовать для отмены запроса, установив свойство Result параметра в результат действия. Для демонстрации этого в папке Infrastructure примера проекта создается специальный класс фильтра действия по имени CustomActionAttribute, код которого приведен в примере ниже:
using System.Web.Mvc; namespace Filter.Infrastructure < public class CustomActionAttribute : FilterAttribute, IActionFilter < public void OnActionExecuting(ActionExecutingContext filterContext) < if (filterContext.HttpContext.Request.IsLocal) < filterContext.Result = new HttpNotFoundResult(); >> public void OnActionExecuted(ActionExecutedContext filterContext) < // не реализован >> >
В этом примере метод OnActionExecuting() применяется для проверки, поступил ли запрос с локальной машины. Если это так, пользователю возвращается ответ 404 — Not Found (не найдено).
В этом примере можно заметить, что для создания работающего фильтра реализовывать оба метода, определенные в интерфейсе IActionFilter, не обязательно. Будьте осторожны, чтобы не сгенерировать исключение NotImplementedException, которое Visual Studio добавляет в класс при реализации интерфейса. Инфраструктура ASP.NET MVC Framework вызывает оба метода в фильтре действия, и если возникнет исключение, будут активизированы фильтры исключений. Если никакой логики в метод добавлять не нужно, просто оставьте его пустым.
Фильтр действия применяется подобно любому другому атрибуту. Для демонстрации работы фильтра действия, созданного в примере, мы добавили в контроллер Home новый метод действия:
using System; using System.Web.Mvc; using Filter.Infrastructure; namespace Filter.Controllers < public class HomeController : Controller < // . [CustomAction] public string FilterTest() < return "Это метод действия FilterTest в контроллере Home"; >> >
Чтобы протестировать фильтр, запустите приложение и перейдите на URL вида /Home/FilterTest. Запрос из браузера будет, естественно, локальным подключением, что приведет к генерации специальным фильтром действия ошибки 404 — Not Found:

Если вы хотите удостовериться, что именно фильтр сгенерировал ошибку, просто удалите атрибут CustomAction из метода действия FilterTest() в контроллере Home и запустите приложение снова.
Реализация метода OnActionExecuted()
Фильтр можно также использовать для решения задачи, которая предусматривает выполнение метода действия. В качестве простого примера в папке Infrastructure создан новый файл класса по имени ProfileActionAttribute.cs, в котором определен класс, предназначенный для измерения времени выполнения метода действия. Код этого фильтра показан в примере ниже:
using System.Diagnostics; using System.Web.Mvc; namespace Filter.Infrastructure < public class ProfileActionAttribute : FilterAttribute, IActionFilter < private Stopwatch timer; public void OnActionExecuting(ActionExecutingContext filterContext) < timer = Stopwatch.StartNew(); >public void OnActionExecuted(ActionExecutedContext filterContext) < timer.Stop(); if (filterContext.Exception == null) < filterContext.HttpContext.Response.Write( string.Format("Время работы метода действия: ", timer.Elapsed.TotalSeconds)); > > > >
В данном примере метод OnActionExecuting() используется для запуска таймера (с применением класса высокоточного таймера Stopwatch из пространства имен System.Diagnostics). Метод OnActionExecuted() вызывается, когда метод действия завершен. В примере ниже показано, как применить этот атрибут к контроллеру Home. (Предыдущий фильтр был удален, поэтому локальные запросы перенаправляться не будут.)
// . [ProfileAction] public string FilterTest() < return "Это метод действия FilterTest в контроллере Home"; >// .
Запустив приложение и перейдя на URL вида /Home/FilterTest, будет получен результат, показанный на рисунке:

Обратите внимание, что информация профилирования выводится в браузере перед результатами метода действия. Причина в том, что фильтр действия выполняется после того, как метод действия завершен, но перед обработкой результата.
В качестве параметра методу OnActionExecuted() передается экземпляр класса ActionExecutedContext. В этом классе определен ряд полезных свойств, описанных в таблице ниже (описаны свойства кроме аналогичных ActionDescriptor и Result).
Возвращает true, если действие было отменено другим фильтром
Возвращает объект исключения, сгенерированного другим фильтром или методом действия
Возвращает true, если исключение было обработано
Свойство Exception возвращает исключение, которое сгенерировал метод действия, а свойство ExceptionHandled указывает, обработал ли это исключение другой фильтр.
Свойство Canceled возвратит true, если другой фильтр отменил запрос (за счет установки значения для свойства Result) после момента, когда был вызван метод OnActionExecuting() фильтра. Метод OnActionExecuted() будет по-прежнему вызываться, но только чтобы можно было провести очистку и освободить занятые ресурсы.
Фильтры
Фильтры позволяют выполнять некоторые действия до или после определенной стадии обработки запроса. В ASP.NET Core MVC имеются следующие типы фильтров:
- Фильтры авторизации : определяют, авторизован ли пользователь для выполнения текущего запроса. Если пользователь не авторизованн для доступа к ресурсу, то фильтр завершает обработку запроса.
- Фильтры ресурсов : выполняются после фильтров авторизации. Его метод OnResourceExecuting() выполняется до всех остальных фильтров и до привязки модели, а его метод OnResourceExecuted() выполняется после всех остальных фильтров
- Фильтры действий : применяется только к действиям контроллера, запускается после фильтра ресурсов как до, так и после выполнения метода контроллера
- Фильтры исключений : определяют действия в отношении необработанных исключений
- Фильтры результатов действий : фильтр применяется к результатам методов контроллера, выполняется как до, так и после получения результата
Вместе все эти типы фильтров образуют конвейер фильтров (filter pipeline), который встроен в процесс обработки запроса в MVC и который начинает выполняется после того, как инфраструктура MVC выбрала метод контроллера для обработки запроса. На разных этапах обработки запроса в этом конвейере вызывается соответствующий фильтр:

Определение фильтров
Несмотря на то, что конвейер фильтров образуют пять разных типов фильтров, которые вызываются на разных этапах и имеют свою строго задачу, тем не менее все они имеют общие моменты реализации. Так, все фильтры поддерживают два способа реализации: синхронную и асинхронную. В зависимости от выбранного способа класс фильтра будет реализовать тот или иной интерфейс.
Все фильтры имеют одну и ту же схему. Синхронный интерфейс, который реализуют фильтры, называется I[Stage]Filter , где [Stage] — это этап обработки запроса, на котором вызывается фильтр. Например, для фильтра авторизации этап условно называется Authorization, для фильтров ресурсов — Resoure, для фильтров действий — Action, для фильтров результатов — Result, для фильтров исключений — Exception.
Синхронные фильтры (за исключением фильтра Razor Page) определяют два метода: On[Stage]Executing и On[Stage]Executed . Метод On[Stage]Executing вызывается непосредственно перед этапом Stage, а метод On[Stage]Executed сразу после завершения этапа [Stage] .
Например, типовая реализация для синхронного фильтра действий:
using Microsoft.AspNetCore.Mvc.Filters; public class SimpleActionFilter : IActionFilter < public void OnActionExecuting(ActionExecutingContext context) < // код метода >public void OnActionExecuted(ActionExecutedContext context) < // код метода >>
Асинхронные интерфейсы фильтров называются IAsync[Stage]Filter , и они определяют только один метод — On[Stage]ExecutionAsync
using Microsoft.AspNetCore.Mvc.Filters; public class SimpleAsynActionFilter : IAsyncActionFilter < public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) < // код метода await next(); >>
При реализации интерфейсов следует учитывать, что мы можем реализовать либо только синхронный, либо только асинхронный вариант. Если же класс будет реализовать оба варианта, то система будет вызывать только метод асинхронного интерфейса, а реализация синхронного интерфейса будет игнорироваться.
К примеру, создадим свой фильтр. Для этого добавим в проект папку Filters , в которой будут храниться фильтры. И далее добавим в эту папку новый класс SimpleResourceFilter , который будет представлять простейший фильтр ресурсов
using Microsoft.AspNetCore.Mvc.Filters; namespace MvcApp.Filters < public class SimpleResourceFilter : Attribute, IResourceFilter < public void OnResourceExecuting(ResourceExecutingContext context) < context.HttpContext.Response.Cookies.Append("LastVisit", DateTime.Now.ToString("dd/MM/yyyy HH-mm-ss")); >public void OnResourceExecuted(ResourceExecutedContext context) < // реализация отсутствует >> >

Смысл фильтра будет заключаться в том, что он в ответ пользователю будет добавлять куки «LastVisit», которые будут хранить дату и время последнего визита.
Обратите внимание! Изменение объекта Response (то есть по сути изменение ответа пользователю) проивзодится в методе OnResourceExecuting, который выполняется до методов контроллера и соответственно до выполнения результата и формирования ответа пользователю. Если мы попытаемся выполнить все те же действия в методе OnResourceExecuted , то приложение в процессе выполнения сгенерирует исключение. Это нужно иметь в виду при реализации всех видов фильтров.
Также стоит отметить, что класс фильтра также наследует класс Attribute , так как фильтры реализуются в основном именно как атрибуты, что упрощает их применение.
Применение фильтра
Теперь применим выше определенный фильтр и для этого определим следующий код контроллера:
using Microsoft.AspNetCore.Mvc; using MvcApp.Filters; // пространство имен фильтра SimpleResourceFilter namespace MvcApp.Controllers < [SimpleResourceFilter] public class HomeController : Controller < public IActionResult Index() =>View(); > >
В данном случае фильтр применяется ко всему контроллеру. Запустим проект, и после получения ответа в куках окажутся данные с ключом «LastVisit»:

Если бы мы не использовали бы фильтр, то в каждом методе контроллера нам надо было бы определить строку кода:
HttpContext.Response.Cookies.Append("LastVisit", DateTime.Now.ToString("dd/MM/yyyy hh-mm-ss"));
Таким образом, фильтры позволяют нам избежать повторения в соответствии принципом DRY (Don’t Repeat Yourself)
Выход из конвейера фильтров
Как показано выше, фильтры организованы в конвейер, в котором они последовательно выполняются. Однако мы можем на любом этапе выйти из этой конвейера, предотвратив выполнение последующих фильтров. Для этого надо установить свойство Result переданного в фильтр контекста.
Для этого добавим в проект новый фильтр:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; namespace MvcApp.Filters < public class FakeNotFoundResourceFilter : Attribute, IResourceFilter < public void OnResourceExecuted(ResourceExecutedContext context) < >public void OnResourceExecuting(ResourceExecutingContext context) < context.Result = new ContentResult < Content = "Ресурс не найден" >; > > >
Это фильтр ресурсов, который устанавливает свойство Result . Значение этого свойства фактически будет использоваться в качестве результата выполнения запроса.
Затем применим фильтр к методу контроллера:
using Microsoft.AspNetCore.Mvc; using MvcApp.Filters; // пространство имен фильтров namespace MvcApp.Controllers < public class HomeController : Controller < [FakeNotFoundResourceFilter] public IActionResult Index() =>View(); > >
При обращении к методу Index сработает фильтр FakeNotFoundResourceFilter, который установит результат обработки запроса. И после него никакие другие фильтры не будут выполняться.
Фильтры действий в ASP.NET Core
ASP.NET Core — это мощный и универсальный фреймворк для создания веб-приложений. Он предоставляет широкий набор возможностей для создания надежных и масштабируемых приложений, и одной из ключевых фич, расширяющих его функциональность, являются фильтры действий (Action Filters). Фильтры действий позволяют выполнять код до или после выполнения метода контроллера (или метода действия), что дает возможность добавить в приложение сквозной функционал.
В этой статье мы рассмотрим фильтры действий в ASP.NET Core, разберемся в их типах и научимся создавать пользовательские фильтры для расширения функциональности нашего веб-приложения.
Что из себя представляют фильтры действий?
Фильтры действий в ASP.NET Core — это атрибуты, которые могут быть применены к методам действий контроллера (controller action methods) для выполнения предварительной или последующей обработки для этих методов. Они позволяют добавлять функционал, который будет выполняется до или после выполнения методов контроллера. Фильтры действий могут использоваться для реализации таких сквозных задач, как протоколирование, аутентификация, кэширование и т.д.
В ASP.NET Core существует целых пять типов фильтров действий:

- Фильтры авторизации (Authorization Filter)
- Фильтры ресурсов (Resource Filter)
- Фильтры действий (Action Filter)
- Фильтры результатов (Result Filter)
- Фильтры исключений (Exception Filter)
Фильтры авторизации
Фильтры авторизации играют важную роль в обеспечении соблюдения правил аутентификации и авторизации в веб-приложении. Фильтры авторизации обычно используются для реализации предоставления доступа к определенным частям приложения только аутентифицированным и авторизованным пользователям. Эти фильтры выполняются перед методами контроллера, позволяя проверить учетные данные и разрешения пользователя и, соответственно, предоставить или запретить доступ. Они являются одним из основных компонентов для реализации безопасности и контроля доступа в приложениях ASP.NET Core.
Пример
Предположим, что у вас есть контроллер с методом действия, доступ к которому вы хотите ограничить в зависимости от роли пользователя. В этом случае мы создадим фильтр авторизации, который будет проверять, имеет ли пользователь определенную роль, прежде чем разрешить ему доступ к методу действия.
Сначала определим пользовательский фильтр авторизации:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Http; using System; public class CustomAuthorizationFilter : Attribute, IAuthorizationFilter < public void OnAuthorization(AuthorizationFilterContext context) < // Проверяем принадлежность пользователя к роли "Admin" if (!context.HttpContext.User.IsInRole("Admin")) < // Если у него нет этой роли, то отказать в доступе и вернуть статус forbidden context.Result = new StatusCodeResult(StatusCodes.Status403Forbidden); >> >
Затем применим CustomAuthorizationFilter к методу контроллера:
[CustomAuthorizationFilter] // Применяем наш фильтр авторизации public IActionResult AdminOnlyAction() < // Это действие доступно только пользователям с ролью "Admin". return View(); >
В данном примере фильтр CustomAuthorizationFilter применяется к методу AdminOnlyAction . Когда пользователь пытается получить доступ к этому действию, фильтр проверяет, принадлежит ли ему роль «Admin», используя метод IsInRole . Если пользователю не принадлежит роль «Admin», фильтр устанавливает код состояния HTTP-ответа 403 Forbidden, запрещая доступ к действию.
Фильтры ресурсов
Фильтры ресурсов в ASP.NET Core — это тип фильтров действий, который позволяет выполнять действия, влияющие на весь HTTP-запрос и ответ, например, изменять заголовки ответа или обрабатывать глобальные исключения. Эти фильтры выполняются до того, как другие типы фильтров (фильтры авторизации, действий, результатов и исключений) получают доступ к HTTP-контексту, и могут влиять на весь конвейер обработки запроса.
- Глобальная обработка исключений: Фильтры ресурсов могут использоваться для обработки исключений, возникающих в процессе обработки запросов. Реализовав фильтр ресурсов для обработки исключений, можно перехватывать и обрабатывать исключения глобально, обеспечивая согласованный способ регистрации ошибок, отображения детализированных страниц ошибок или выполнения других действий.
- Модификация ответа: С помощью фильтров ресурсов можно модифицировать объект ответа, например, добавить пользовательские заголовки в ответ, изменить код состояния или содержимое ответа.
- Предварительная обработка запроса: Фильтры ресурсов могут выполнять действия в начале конвейера запроса, например, устанавливать переменные запроса, или выполнять другие задачи предварительной обработки.
- Глобальное логирование: Вы можете использовать фильтры ресурсов для глобального логирования, чтобы регистрировать информацию о входящих запросах, времени отклика или других показателях, относящихся ко всему приложению.
Пример
Давайте создадим простой фильтр ресурсов, который будет добавлять пользовательский заголовок ответа к каждому ответу в нашем ASP.NET Core приложении. В этом примере мы добавим к ответу заголовок «X-Custom-Header».
Создадим пользовательский фильтр ресурсов:
using Microsoft.AspNetCore.Mvc.Filters; public class AddCustomHeaderResourceFilter : IResourceFilter < public void OnResourceExecuting(ResourceExecutingContext context) < // Код, выполняемый перед действием context.HttpContext.Response.Headers.Add("X-Custom-Header", "MyCustomValue"); >public void OnResourceExecuted(ResourceExecutedContext context) < // Код, выполняемый после действия >>
Его можно использовать в методе ConfigureServices :
services.AddMvc(options => < options.Filters.Add(); >);
Теперь этот фильтр ресурсов будет выполняться для каждого запроса в вашем ASP.NET Core приложении, добавляя в заголовки ответа «X-Custom-Header».
Фильтры ресурсов — это мощный способ выполнения глобальных действий, которые применяются ко всем запросам и ответам в приложении, что делает их ценным инструментом для решения таких задач, как глобальная обработка исключений, модификация ответов и предварительная обработка запросов.
Фильтры действий
Фильтры действий в ASP.NET Core — это атрибуты, позволяющие добавлять логику, которая работает до и после выполнения отдельных методов действий в контроллерах. Эти фильтры используются для выполнения таких задач, как логирование, проверка ввода, изменение результата действия и т.д.
Пример
Создадим простой фильтр фильтр действий для регистрации начала и окончания выполнения метода контроллера.
Создадим пользовательский фильтр действий:
using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.Logging; public class LogActionFilter : IActionFilter < private readonly ILogger_logger; public LogActionFilter(ILogger logger) < _logger = logger; >public void OnActionExecuting(ActionExecutingContext context) < // Этот метод выполняется до метода контроллера _logger.LogInformation($"Action '' is starting."); > public void OnActionExecuted(ActionExecutedContext context) < // Этот метод выполняется после метода контроллера _logger.LogInformation($"Action '' has completed."); > >
Его можно использовать в методе ConfigureServices .
services.AddMvc(options => < options.Filters.Add(); >);
Применим наш фильтр действий к методу действия контроллера.
[ServiceFilter(typeof(LogActionFilter))] // Применяем фильтр к данному методу контроллера public IActionResult MyAction() < // Логика нашего метода контроллера >
Теперь при каждом вызове метода MyAction фильтр LogActionFilter будет регистрировать начало и конец действия, представляя собой простой способ контроля за выполнением методов контроллера.
Фильтры результатов
Фильтры результатов в ASP.NET Core — это тип фильтров действий, который выполняет код после выполнения метода действия, но до обработки результата и отправки его клиенту. Такие фильтры полезны для модификации ответа или результата, добавления пользовательских заголовков или выполнения действий, связанных с ответом, до его возврата клиенту.
Пример
Давайте создадим простой фильтр результатов для добавления в ответ пользовательского заголовка.
Создадим пользовательский фильтр результатов:
using Microsoft.AspNetCore.Mvc.Filters; public class AddCustomHeaderResultFilter : IResultFilter < public void OnResultExecuting(ResultExecutingContext context) < // Этот метод запускается до выполнения результата context.HttpContext.Response.Headers.Add("X-Custom-Header", "MyCustomValue"); >public void OnResultExecuted(ResultExecutedContext context) < // Этот метод запускается после выполнения результата >>
Это можно сделать в методе ConfigureServices :
services.AddMvc(options => < options.Filters.Add(); >);
Применим наш фильтр результатов к методу действия контроллера.
[ServiceFilter(typeof(AddCustomHeaderResultFilter))] // Применяем фильтр к данному методу контроллера public IActionResult MyAction() < // Логика нашего метода контроллера >
При вызове метода MyAction фильтр AddCustomHeaderResultFilter будет добавлять «X-Custom-Header» в заголовки ответа перед его отправкой клиенту. Это может быть полезно в сценариях, где требуется добавить пользовательские заголовки в ответ, установить типы содержимого ответа или выполнить другие действия, связанные с ответом.
Фильтры исключений
Фильтры исключений в ASP.NET Core — это разновидность фильтров действий, специально разработанных для обработки исключений, возникающих во время выполнения метода контроллера. Эти фильтры позволяют определять пользовательскую логику для изящной обработки и реагирования на исключения, обеспечивая централизованную обработку ошибок, в целом улучшая юзер экспириенс.
Как работают фильтры исключений?
Фильтры исключений выполняются, когда во время выполнения метода контроллера возникает необработанное исключение. Они перехватывают исключение до того, как оно распространится по стеку вызовов, и предоставляют возможность выполнить пользовательскую обработку ошибок.
Примеры использования фильтров исключений
- Пользовательские страницы ошибок: Фильтры исключений могут перенаправлять пользователя на пользовательские страницы ошибок, отображая удобные для пользователя сообщения об ошибках вместо стандартной страницы.
- Логирование и отчетность: С помощью фильтров исключений можно регистрировать исключения, что облегчает выявление и устранение проблем. Кроме того, можно передавать отчеты об исключениях во внешние системы для дальнейшего анализа.
- Постепенное отключение функций: В случаях, когда возникает исключение, но приложение продолжает функционировать, фильтр исключений может обработать ошибку и вернуть частичный или ухудшенный ответ вместо полного отказа.
Пример
Создадим простой фильтр исключений для регистрации и обработки исключений.
Создадим пользовательский фильтр исключений:
using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.Logging; public class CustomExceptionFilter : IExceptionFilter < private readonly ILogger_logger; public CustomExceptionFilter(ILogger logger) < _logger = logger; >public void OnException(ExceptionContext context) < // Регистрируем исключение _logger.LogError($"An exception occurred: "); // Обрабатываем исключение context.Result = new ViewResult < ViewName = "Error" >; context.ExceptionHandled = true; > >
Это можно сделать в методе ConfigureServices :
services.AddMvc(options => < options.Filters.Add(); >);
Применим фильтр исключений к методу действия контроллера:
[ServiceFilter(typeof(CustomExceptionFilter))] // Применяем фильтр к данному методу контроллера public IActionResult MyAction() < // Логика нашего метода контроллера >
Если в методе MyAction возникает необработанное исключение, то CustomExceptionFilter регистрирует ошибку и перенаправляет пользователя на пользовательскую страницу, подготовленную для этой ошибки.
Реальные примеры использования
Фильтры действий невероятно универсальны и могут находить применение в самых разных сценариях. Вот несколько реальных примеров использования фильтров действий в ASP.NET Core.
- Логирование: Вы можете создать фильтр действий, который будет записывать в логи информацию о выполнении методов контроллеров, что поможет при отладке и мониторинге.
- Валидация: Реализуйте проверку достоверности входных данных перед выполнением метода контроллера, чтобы убедиться в том, что входные данные являются достоверными.
- Кэширование: Используйте фильтры действий для кэширования результатов методов контроллера, чтобы повысить производительность и сократить количество обращений к базе данных или API.
- Безопасность: Реализация проверок безопасности и логики авторизации с использованием фильтров действий для ограничения доступа к определенным методам контроллера на основе ролей и разрешений пользователей.
- Обработка исключений: Создание пользовательских фильтров исключений для последовательной и удобной обработки и регистрации исключений.
Заключение
Фильтры действий в ASP.NET Core — это мощный инструмент для добавления сквозных задач и расширения функциональности веб-приложений. Понимание различных типов фильтров действий и создание пользовательских фильтров при необходимости позволяет оптимизировать такие распространенные задачи, как логирование, валидация, кэширование и обеспечение безопасности, что делает приложение более надежным и удобным в обслуживании. Независимо от того, создаете ли вы небольшое веб-приложение или крупную корпоративную систему, фильтры действий помогут вам добиться лучшей организации кода и его удобства в обслуживании, придерживаясь принципа DRY (Don’t Repeat Yourself).
Спасибо за внимание!
Часто задаваемые вопросы:
Вопрос: В чем разница между методами GET и POST в ASP.NET Core?
Ответ: В ASP.NET Core GET и POST — это HTTP-методы, используемые для запроса и отправки данных соответственно. GET используется для получения данных и не должен оказывать влияния на сервер. Обычно с его помощью извлекаются данные и отображаются представления. POST, с другой стороны, используется для отправки данных на сервер, часто для создания, обновления или удаления ресурсов. POST-запросы могут изменять данные на сервере, поэтому их следует использовать при отправке форм или внесении изменений.
Вопрос: Как передать данные из метода контроллера в представление в ASP.NET Core?
Ответ: Передать данные из метода контроллер в представление в ASP.NET Core можно с помощью ViewBag , ViewData или сильно типизированной модели. ViewBag и ViewData — это динамические объекты, позволяющие хранить и извлекать данные в рамках контроллера и представления. Сильно типизированная модель, как правило, ViewModel , является более структурированным подходом и рекомендуется для сложных сценариев, поскольку обеспечивает типобезопасность и в целом лучшую организацию кода.
Вопрос: Что такое параметры действия и как они связаны с методами контроллера в ASP.NET Core?
Ответ: Параметры действия (action parameters) в ASP.NET Core представляют собой значения, передаваемые методу контроллера. Эти значения могут поступать из различных источников, таких как значения маршрута, строки запроса, данные формы или тело запроса. Для автоматического сопоставления этих значений с параметрами метода контроллера в ASP.NET Core используется процесс, называемый привязкой модели (model binding). Для указания источника данных для каждого параметра можно использовать такие атрибуты, как [FromRoute], [FromQuery] и [FromBody]. Привязка модели упрощает процесс извлечения данных из HTTP-запроса и делает их доступными для обработки в методах контроллера.
Вопрос: В чем разница между ActionResult и IActionResult в методах контроллера в ASP.NET Core?
Ответ: ActionResult и IActionResult используются для возврата результатов из методов контроллера в ASP.NET Core. Основное различие заключается в том, что ActionResult — это подтип IActionResult . ActionResult включает в себя несколько производных классов, таких как ViewResult , JsonResult и RedirectToActionResult , которые обеспечивают специфическое поведение для ряда распространенных сценариев. IActionResult , с другой стороны, является более общим классом и может использоваться для возврата результатов любого типа. Выбор между ActionResult и IActionResult зависит от того, какой уровень конкретики и безопасности вы требуете от результатов метода контроллера.
Вопрос: Как обрабатывать асинхронные действия в методах контроллеров в ASP.NET Core?
Ответ: Для обработки асинхронных действий в ASP.NET Core можно использовать ключевые слова async и await. Можно пометить метод контроллера модификатором async и вернуть Task , что позволит выполнять асинхронные операции, например запросы к базе данных или вызовы API, не блокируя поток запроса. Это гарантирует, что приложение останется отзывчивым и сможет эффективно обрабатывать одновременные запросы. Асинхронные действия могут быть полезны для повышения масштабируемости и производительности веб-приложения, особенно при работе с операциями, связанными с вводом-выводом.
В заключение приглашаем всех желающих на бесплатный открытый урок «Пишем свой API: OData», который пройдет сегодня в 20:00. На нем мы получим представление и примеры работы с протоколом Odata, а также поговорим о его преимущствах по сравнению с REST на ASP.NET Core. Записаться можно на странице онлайн-курса «C# ASP.NET Core разработчик».
Общие сведения о фильтрах действий (C#)
Цель этого руководства — объяснить фильтры действий. Фильтр действий — это атрибут, который можно применить к действию контроллера или ко всему контроллеру, который изменяет способ выполнения действия.
Основные сведения о фильтрах действий
Цель этого руководства — объяснить фильтры действий. Фильтр действий — это атрибут, который можно применить к действию контроллера или ко всему контроллеру, который изменяет способ выполнения действия. Платформа MVC ASP.NET включает несколько фильтров действий:
- OutputCache — этот фильтр действий кэширует выходные данные действия контроллера в течение указанного периода времени.
- HandleError — этот фильтр действий обрабатывает ошибки, возникающие при выполнении действия контроллера.
- Авторизовать — этот фильтр действий позволяет ограничить доступ к определенному пользователю или роли.
Вы также можете создать собственные настраиваемые фильтры действий. Например, может потребоваться создать настраиваемый фильтр действий, чтобы реализовать пользовательскую систему проверки подлинности. Кроме того, может потребоваться создать фильтр действий, который изменяет данные представления, возвращаемые действием контроллера.
В этом руководстве вы узнаете, как создать фильтр действий с нуля. Мы создаем фильтр действий журнала, который регистрирует различные этапы обработки действия в окне вывода Visual Studio.
Использование фильтра действий
Фильтр действий является атрибутом. Большинство фильтров действий можно применить либо к отдельному действию контроллера, либо ко всему контроллеру.
Например, контроллер данных в листинге 1 предоставляет действие с именем Index() , которое возвращает текущее время. Это действие дополнено фильтром OutputCache действий. Этот фильтр приводит к кэшированию значения, возвращаемого действием, в течение 10 секунд.
Листинг 1 — Controllers\DataController.cs
using System; using System.Web.Mvc; namespace MvcApplication1.Controllers < public class DataController : Controller < [OutputCache(Duration=10)] public string Index() < return DateTime.Now.ToString("T"); >> >
Если вы несколько раз вызываете Index() действие, вводя URL-адрес /Data/Index в адресной строке браузера и нажимая кнопку Обновить несколько раз, вы увидите то же время в течение 10 секунд. Выходные Index() данные действия кэшируются в течение 10 секунд (см. рис. 1).

В листинге 1 к методу OutputCache Index() применяется один фильтр действий — фильтр действий. При необходимости можно применить несколько фильтров действий к одному действию. Например, может потребоваться применить OutputCache фильтры действий и HandleError к одному и тому же действию.
В листинге OutputCache 1 к действию применяется Index() фильтр действий. Этот атрибут также можно применить к самому классу DataController . В этом случае результат, возвращаемый любым действием, предоставляемым контроллером, будет кэшироваться в течение 10 секунд.
Различные типы фильтров
Платформа MVC ASP.NET поддерживает четыре различных типа фильтров:
- Фильтры авторизации — реализует IAuthorizationFilter атрибут .
- Фильтры действий — реализует IActionFilter атрибут .
- Фильтры результатов — реализует IResultFilter атрибут .
- Фильтры исключений — реализует IExceptionFilter атрибут .
Фильтры выполняются в указанном выше порядке. Например, фильтры авторизации всегда выполняются перед фильтрами действий и фильтрами исключений после каждого другого типа фильтра.
Фильтры авторизации используются для реализации проверки подлинности и авторизации для действий контроллера. Например, фильтр «Авторизация» является примером фильтра авторизации.
Фильтры действий содержат логику, которая выполняется до и после выполнения действия контроллера. Например, можно использовать фильтр действий для изменения данных представления, возвращаемого действием контроллера.
Фильтры результатов содержат логику, которая выполняется до и после выполнения результата представления. Например, может потребоваться изменить результат представления непосредственно перед отображением представления в браузере.
Фильтры исключений — это последний тип фильтра для запуска. Фильтр исключений можно использовать для обработки ошибок, вызванных действиями контроллера или результатами действий контроллера. Вы также можете использовать фильтры исключений для регистрации ошибок.
Каждый тип фильтра выполняется в определенном порядке. Если вы хотите управлять порядком, в котором выполняются фильтры одного типа, можно задать свойство order фильтра.
Базовым классом для всех фильтров действий является System.Web.Mvc.FilterAttribute класс . Если вы хотите реализовать определенный тип фильтра, необходимо создать класс, который наследует от базового класса Filter и реализует один или IAuthorizationFilter несколько интерфейсов , IActionFilter , , IResultFilter или IExceptionFilter .
Класс Base ActionFilterAttribute
Чтобы упростить реализацию настраиваемого фильтра действий, платформа MVC ASP.NET включает базовый ActionFilterAttribute класс. Этот класс реализует интерфейсы IActionFilter и и IResultFilter наследует от Filter класса .
Терминология здесь не совсем согласована. Технически класс, наследующий от класса ActionFilterAttribute, является одновременно фильтром действий и фильтром результатов. Однако в свободном смысле слово фильтр действий используется для обозначения любого типа фильтра в ASP.NET платформе MVC.
Базовый ActionFilterAttribute класс имеет следующие методы, которые можно переопределить:
- OnActionExecuting — этот метод вызывается перед выполнением действия контроллера.
- OnActionExecuted — этот метод вызывается после выполнения действия контроллера.
- OnResultExecuting — этот метод вызывается перед выполнением результата действия контроллера.
- OnResultExecuted — этот метод вызывается после выполнения результата действия контроллера.
В следующем разделе мы рассмотрим, как реализовать каждый из этих методов.
Создание фильтра действий журнала
Чтобы проиллюстрировать создание настраиваемого фильтра действий, мы создадим настраиваемый фильтр действий, который регистрирует этапы обработки действия контроллера в окне Вывода Visual Studio. Наш LogActionFilter содержится в листинге 2.
Листинг 2 — ActionFilters\LogActionFilter.cs
using System; using System.Diagnostics; using System.Web.Mvc; using System.Web.Routing; namespace MvcApplication1.ActionFilters < public class LogActionFilter : ActionFilterAttribute < public override void OnActionExecuting(ActionExecutingContext filterContext) < Log("OnActionExecuting", filterContext.RouteData); >public override void OnActionExecuted(ActionExecutedContext filterContext) < Log("OnActionExecuted", filterContext.RouteData); >public override void OnResultExecuting(ResultExecutingContext filterContext) < Log("OnResultExecuting", filterContext.RouteData); >public override void OnResultExecuted(ResultExecutedContext filterContext) < Log("OnResultExecuted", filterContext.RouteData); >private void Log(string methodName, RouteData routeData) < var controllerName = routeData.Values["controller"]; var actionName = routeData.Values["action"]; var message = String.Format("controller: action:", methodName, controllerName, actionName); Debug.WriteLine(message, "Action Filter Log"); > > >
В листинге OnActionExecuting() 2 методы , OnActionExecuted() , OnResultExecuting() и OnResultExecuted() вызывают Log() метод . В метод передаются имя метода и данные текущего Log() маршрута. Метод Log() записывает сообщение в окно Вывода Visual Studio (см. рис. 2).

Рис. 02. Запись в окно вывода Visual Studio (щелкните для просмотра полноразмерного изображения)
Контроллер Home в листинге 3 показывает, как можно применить фильтр действий log ко всему классу контроллера. Всякий раз, когда вызывается какое-либо действие, предоставляемое контроллером Home ( метод Index() или About() метод ), этапы обработки действия регистрируются в окне Вывода Visual Studio.
Листинг 3 . Controllers\HomeController.cs
using System.Web.Mvc; using MvcApplication1.ActionFilters; namespace MvcApplication1.Controllers < [LogActionFilter] public class HomeController : Controller < public ActionResult Index() < return View(); >public ActionResult About() < return View(); >> >
Итоги
В этом руководстве вы познакомились с ASP.NET фильтрами действий MVC. Вы узнали о четырех различных типах фильтров: фильтрах авторизации, фильтрах действий, фильтрах результатов и фильтрах исключений. Вы также узнали о базовом ActionFilterAttribute классе.
Наконец, вы узнали, как реализовать простой фильтр действий. Мы создали фильтр действий журнала, который регистрирует этапы обработки действия контроллера в окне Вывода Visual Studio.