0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: asp.net, фильтры ресурсов</p>
1
<p>Теги: asp.net, фильтры ресурсов</p>
2
<p>Как правило,<strong>фильтр ресурсов</strong>используется в целях переопределения результата действия. Это бывает полезно, к примеру, в ситуации с кэшированием: мы можем получить кэш в фильтре ресурсов и сразу установить результат, избавившись тем самым от повторной генерации результатов в методах контроллера.</p>
2
<p>Как правило,<strong>фильтр ресурсов</strong>используется в целях переопределения результата действия. Это бывает полезно, к примеру, в ситуации с кэшированием: мы можем получить кэш в фильтре ресурсов и сразу установить результат, избавившись тем самым от повторной генерации результатов в методах контроллера.</p>
3
<p>Чтобы создать фильтр ресурсов потребуется реализовать один из двух интерфейсов на выбор:</p>
3
<p>Чтобы создать фильтр ресурсов потребуется реализовать один из двух интерфейсов на выбор:</p>
4
<ul><li><strong>IResourceFilter</strong>,</li>
4
<ul><li><strong>IResourceFilter</strong>,</li>
5
<li><strong>IAsyncResourceFilter</strong>.</li>
5
<li><strong>IAsyncResourceFilter</strong>.</li>
6
</ul><h2>Пример работы</h2>
6
</ul><h2>Пример работы</h2>
7
<p>Давайте представим, что нам требуется ограничить доступ к веб-сайту для старых браузеров типа проблемного IE. Для решения поставленных задач пригодится простой фильтр ресурсов.</p>
7
<p>Давайте представим, что нам требуется ограничить доступ к веб-сайту для старых браузеров типа проблемного IE. Для решения поставленных задач пригодится простой фильтр ресурсов.</p>
8
<p>Итак, добавим в наш проект следующий класс фильтра:</p>
8
<p>Итак, добавим в наш проект следующий класс фильтра:</p>
9
<p>Обратите внимание, что интерфейс<strong>IResourceFilter</strong>предоставляет 2 метода:</p>
9
<p>Обратите внимание, что интерфейс<strong>IResourceFilter</strong>предоставляет 2 метода:</p>
10
<ol><li>OnResourceExecuting(). Этот метод срабатывает после фильтров авторизации, однако до выполнения метода и до работы фильтров действий/результатов/исключений.</li>
10
<ol><li>OnResourceExecuting(). Этот метод срабатывает после фильтров авторизации, однако до выполнения метода и до работы фильтров действий/результатов/исключений.</li>
11
<li>OnResourceExecuted(). Тут срабатывание происходит после выполнения метода и фильтров действий/результатов/исключений.</li>
11
<li>OnResourceExecuted(). Тут срабатывание происходит после выполнения метода и фильтров действий/результатов/исключений.</li>
12
</ol><p>В качестве параметра в оба этих метода передается параметр типа<strong>ResourceExecutedContext</strong>-- он позволяет как получать данные запроса, так и управлять ответом.</p>
12
</ol><p>В качестве параметра в оба этих метода передается параметр типа<strong>ResourceExecutedContext</strong>-- он позволяет как получать данные запроса, так и управлять ответом.</p>
13
<p>В нашем случае мы проверяем заголовок "User-Agent". Если этот заголовок содержит подстроки, соответствующие браузеру Internet Explorer, то посредством свойства Result будет переустановлен ответ. Обработка запроса на этом завершится, а метод и последующие фильтры не выполнятся.</p>
13
<p>В нашем случае мы проверяем заголовок "User-Agent". Если этот заголовок содержит подстроки, соответствующие браузеру Internet Explorer, то посредством свойства Result будет переустановлен ответ. Обработка запроса на этом завершится, а метод и последующие фильтры не выполнятся.</p>
14
<p>А вот как можно реализовать эту задачу в асинхронной версии:</p>
14
<p>А вот как можно реализовать эту задачу в асинхронной версии:</p>
15
<p>Асинхронная версия определяет лишь один метод, принимающий еще и параметр<strong>ResourceExecutingContext</strong>. Причем 2-й параметр здесь -- это объект<strong>ResourceExecutionDelegate</strong>, предоставляющий делегат, вызов которого позволит передать обработку запроса дальше -- это могут быть следующие в конвейере фильтры либо непосредственно контроллер, либо страница Razor Page.</p>
15
<p>Асинхронная версия определяет лишь один метод, принимающий еще и параметр<strong>ResourceExecutingContext</strong>. Причем 2-й параметр здесь -- это объект<strong>ResourceExecutionDelegate</strong>, предоставляющий делегат, вызов которого позволит передать обработку запроса дальше -- это могут быть следующие в конвейере фильтры либо непосредственно контроллер, либо страница Razor Page.</p>
16
<p><em>По материалам https://metanit.com/sharp/aspnet5/.</em></p>
16
<p><em>По материалам https://metanit.com/sharp/aspnet5/.</em></p>
17
17