Фильтры ресурсов
Как правило, фильтр ресурсов используется в целях переопределения результата действия. Это бывает полезно, к примеру, в ситуации с кэшированием: мы можем получить кэш в фильтре ресурсов и сразу установить результат, избавившись тем самым от повторной генерации результатов в методах контроллера.
Чтобы создать фильтр ресурсов потребуется реализовать один из двух интерфейсов на выбор:
- IResourceFilter,
- IAsyncResourceFilter.
Пример работы
Давайте представим, что нам требуется ограничить доступ к веб-сайту для старых браузеров типа проблемного IE. Для решения поставленных задач пригодится простой фильтр ресурсов.
Итак, добавим в наш проект следующий класс фильтра:
Обратите внимание, что интерфейс IResourceFilter предоставляет 2 метода:
OnResourceExecuting() . Этот метод срабатывает после фильтров авторизации, однако до выполнения метода и до работы фильтров действий/результатов/исключений.OnResourceExecuted() . Тут срабатывание происходит после выполнения метода и фильтров действий/результатов/исключений.
В качестве параметра в оба этих метода передается параметр типа ResourceExecutedContext -- он позволяет как получать данные запроса, так и управлять ответом.
В нашем случае мы проверяем заголовок "User-Agent". Если этот заголовок содержит подстроки, соответствующие браузеру Internet Explorer, то посредством свойства Result будет переустановлен ответ. Обработка запроса на этом завершится, а метод и последующие фильтры не выполнятся.
А вот как можно реализовать эту задачу в асинхронной версии:
Асинхронная версия определяет лишь один метод, принимающий еще и параметр ResourceExecutingContext. Причем 2-й параметр здесь -- это объект ResourceExecutionDelegate , предоставляющий делегат, вызов которого позволит передать обработку запроса дальше -- это могут быть следующие в конвейере фильтры либо непосредственно контроллер, либо страница Razor Page.
По материалам https://metanit.com/sharp/aspnet5/.