Фильтры ресурсов: прерывание выполнения методов действий¶
Фильтры ресурсов - первые фильтры общего назначения в конвейере фильтров MVC.
ASP.NET Core включает в себя несколько реализаций фильтров ресурсов, например:
ConsumesAttribute— может использоваться для ограничения разрешенных форматов, которые может принимать метод действия, например[Consumes("application/json")], при этом запросы с неподдерживаемым форматом получат ответ415 Unsupported Media Type;DisableFormValueModelBindingAttribute— предотвращает привязку модели к данным формы в теле запроса. Это может быть полезно, если вы знаете, что метод действия будет обрабатывать загрузку крупных файлов, которой нужно будет управлять вручную1.
В коде контроллера есть строки, которые можно переделать в фильтр ресурсов, а именно
Это — переключатель функций (feature toggle, feature flag), который можно использовать, чтобы управлять доступностью API на основе настройки или значения из БД2. В примере у нас — жёстко зашитое значение.
Вот примерная реализация FeatureEnabledAttribute:
public class FeatureEnabledAttribute : Attribute, IResourceFilter
{
public bool IsEnabled { get; set; }
public void OnResourceExecuting(ResourceExecutingContext context)
{
if (!IsEnabled)
{
context.Result = new BadRequestResult();
}
}
public void OnResourceExecuted(ResourceExecutedContext context) { }
}
В этом примере демонстрируются следующие концепции:
- фильтр может быть атрибутом. Им можно декорировать контроллер, методы действий и страницы Razor с помощью
[FeatureEnabled(IsEnabled=true)]; - интерфейс фильтра состоит из двух методов, и оба нужно реализовать, даже если нужен только один;
- методы фильтра получают объект контекста, обеспечивающего, помимо прочего, доступ к
HttpContext; - чтобы прервать выполнение конвейера, нужно задать
context.Result. Фреймворк выполнит этот результат, игнорируя оставшиеся фильтры в конвейере и пропуская целиком метод действия.
-
Подробнее см. в блоге автора ↩
Последнее обновление :
5 ноября 2023 г.
Дата создания : 3 октября 2022 г.
Дата создания : 3 октября 2022 г.