какие существуют типы action filters

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

— это фильтры, которые могут применяться для любых целей. Встроенный интерфейс для создания фильтра данного типа, IActionFilter, показан в примере ниже:

Реализация метода OnActionExecuting()

Метод OnActionExecuting() вызывается перед обращением к методу действия. Этой возможностью можно воспользоваться для инспектирования запроса и принятия решения об отмене запроса, модификации запроса или о начале некоторой деятельности, которая включает вызов действия. Данный метод принимает в качестве параметра объект ActionExecutingContext, который является подклассом класса ControllerContext и определяет два дополнительных свойства:

ActionDescriptor

Предоставляет детали о методе действия

Result

Результат для метода действия: фильтр может отменить запрос, установив для этого свойства значение, отличное от null

Фильтр можно использовать для отмены запроса, установив свойство Result параметра в результат действия. Для демонстрации этого в папке Infrastructure примера проекта создается специальный класс фильтра действия по имени CustomActionAttribute, код которого приведен в примере ниже:

В этом примере можно заметить, что для создания работающего фильтра реализовывать оба метода, определенные в интерфейсе IActionFilter, не обязательно. Будьте осторожны, чтобы не сгенерировать исключение NotImplementedException, которое Visual Studio добавляет в класс при реализации интерфейса. Инфраструктура ASP.NET MVC Framework вызывает оба метода в фильтре действия, и если возникнет исключение, будут активизированы фильтры исключений. Если никакой логики в метод добавлять не нужно, просто оставьте его пустым.

Фильтр действия применяется подобно любому другому атрибуту. Для демонстрации работы фильтра действия, созданного в примере, мы добавили в контроллер Home новый метод действия:

Если вы хотите удостовериться, что именно фильтр сгенерировал ошибку, просто удалите атрибут CustomAction из метода действия FilterTest() в контроллере Home и запустите приложение снова.

Реализация метода OnActionExecuted()

Фильтр можно также использовать для решения задачи, которая предусматривает выполнение метода действия. В качестве простого примера в папке Infrastructure создан новый файл класса по имени ProfileActionAttribute.cs, в котором определен класс, предназначенный для измерения времени выполнения метода действия. Код этого фильтра показан в примере ниже:

В данном примере метод OnActionExecuting() используется для запуска таймера (с применением класса высокоточного таймера Stopwatch из пространства имен System.Diagnostics). Метод OnActionExecuted() вызывается, когда метод действия завершен. В примере ниже показано, как применить этот атрибут к контроллеру Home. (Предыдущий фильтр был удален, поэтому локальные запросы перенаправляться не будут.)

Запустив приложение и перейдя на URL вида /Home/FilterTest, будет получен результат, показанный на рисунке:

Обратите внимание, что информация профилирования выводится в браузере перед результатами метода действия. Причина в том, что фильтр действия выполняется после того, как метод действия завершен, но перед обработкой результата.

В качестве параметра методу OnActionExecuted() передается экземпляр класса ActionExecutedContext. В этом классе определен ряд полезных свойств, описанных в таблице ниже (описаны свойства кроме аналогичных ActionDescriptor и Result).

Свойства класса ActionExecutedContext

Возвращает true, если действие было отменено другим фильтром

Возвращает объект исключения, сгенерированного другим фильтром или методом действия

Возвращает true, если исключение было обработано

Свойство Exception возвращает исключение, которое сгенерировал метод действия, а свойство ExceptionHandled указывает, обработал ли это исключение другой фильтр.

Свойство Canceled возвратит true, если другой фильтр отменил запрос (за счет установки значения для свойства Result) после момента, когда был вызван метод OnActionExecuting() фильтра. Метод OnActionExecuted() будет по-прежнему вызываться, но только чтобы можно было провести очистку и освободить занятые ресурсы.

Источник

Какие существуют типы action filters

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

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

Фильтры действий позволяют нам проконтролировать входной контекст запроса при доступе к действию, а также выполнить определенные действия по завершению работы метода действий. Например, мы можем изменить выходной результат метода.

Фильтр действий должен реализовать интерфейс IActionFilter:

С помощью метода OnActionExecuting можно получить информацию о запросе, изменить ее либо вовсе отменить запрос. Передаваемый в метод объект ActionExecutingContext является производным от класса ControllerContext и определяет следующие два дополнительных свойства:

Предоставляет информацию о вызываемом методе действия

Результат метода действий

С помощью свойства Result мы можем отменить результат действия, присвоив этому свойству другой результат действия.

Предоставляет информацию о вызываемом методе действий

Хранит значение, показывающее, отменен ли вызов действия. Если имеет значение true, если вызов действия был отменен другим фильтром

Возвращает исключение, выбрасываемое данным методом действий или другим фильтром

Хранит значение, показывающее, обработано ли исключение. Если имеет true, если исключение обработано

Результат метода действий

В качестве примера мы можем создать следующий фильтр действия:

Здесь в методе OnActionExecuting в случае, если клиент использует браузер Opera (например, мы хотим запретить поддержку своего сайта для этого браузера), то мы возвращаем клиенту статусный код 404. А в методе OnActionExecuted мы добавляем в выходной поток строку.

Фильтр результатов

Фильтры результатов во многом похожи на фильтры действий, поскольку так же могут срабатывать как до возвращения результата действия, так и после. Фильтры результатов реализуют интерфейс IResultFilter:

Например, мы можем выводить в выходной поток имя пользователя (если он авторизован) и текущее время запроса к серверу:

Встроенная реализация фильтров действий и фильтров результатов

Мы можем реализовать только те методы, которые нам нужны, либо сразу все, что делает данный класс довольно гибким.

Источник

Общие сведения о фильтрах действий (C#)

Цель этого учебника заключается в том, чтобы объяснить фильтры действий. Фильтр действия — это атрибут, который можно применить к действию контроллера или всему контроллеру, который изменяет способ выполнения действия.

Понимание действий Фильтры

Цель этого учебника заключается в том, чтобы объяснить фильтры действий. Фильтр действия — это атрибут, который можно применить к действию контроллера или всему контроллеру, который изменяет способ выполнения действия. Платформа mVC ASP.NET включает в себя несколько фильтров действия:

Вы также можете создать свои собственные фильтры действий. Например, для реализации пользовательской системы аутентификации может потребоваться создать пользовательский фильтр действий. Или может потребоваться создать фильтр действия, который изменяет данные представления, возвращенные действием контроллера.

В этом учебнике вы узнаете, как создать фильтр действия с нуля. Мы создаем фильтр действия журнала, который регистрирует различные этапы обработки действия в окно Visual Studio Output.

Использование фильтра действий

Фильтр действия является атрибутом. Вы можете применить большинство фильтров действий либо к индивидуальному действию контроллера, либо ко всему контроллеру.

Например, контроллер данных в листинге Index() 1 предоставляет действие, названное, которое возвращает текущее время. Это действие украшено OutputCache фильтром действия. Этот фильтр приводит к тому, что значение, возвращаемые действием, кэшируется в течение 10 секунд.

Если вы неоднократно вызываете Index() действие, вводя URL/Data/Index в адресную строку браузера и нажимая кнопку Refresh несколько раз, то вы увидите то же время в течение 10 секунд. Выход Index() действия кэшируется в течение 10 секунд (см. рисунок 1).

В листинге 1 к методу OutputCache Index() применяется единый фильтр действия – фильтр действия. При необходимости можно применить несколько фильтров действия к тому же действию. Например, можно применить фильтры OutputCache HandleError действия и действия к тому же действию.

В листинге OutputCache 1 фильтр действия Index() применяется к действию. Вы также можете применить DataController этот атрибут к самому классу. В этом случае результат, возвращенный любым действием, выложенный контроллером, будет кэширован в течение 10 секунд.

Различные типы фильтров

Платформа mVC ASP.NET поддерживает четыре различных типа фильтров:

Фильтры выполняются в порядке, указанном выше. Например, фильтры авторизации всегда выполняются до того, как фильтры действий и фильтры исключений всегда выполняются после любого другого типа фильтров.

Фильтры авторизации используются для реализации проверки подлинности и авторизации для действий контроллера. Например, фильтр Authorize является примером фильтра авторизации.

Фильтры действий содержат логику, которая выполняется до и после выполнения действия контроллера. Например, можно использовать фильтр действия для изменения данных представления, которые возвращает действие контроллера.

Фильтры результатов содержат логику, которая выполняется до и после выполнения результата представления. Например, можно изменить результат представления прямо перед тем, как представление будет отображено в браузер.

Фильтры исключений являются последним типом фильтра для запуска. Вы можете использовать фильтр исключения для обработки ошибок, поднятых либо действиями контроллера, либо результатами действий контроллера. Для регистрации ошибок также можно использовать фильтры исключений.

Каждый тип фильтра выполняется в определенном порядке. Если вы хотите контролировать порядок, в котором выполняются фильтры одного и того же типа, можно установить свойство заказа фильтра.

Базовый класс ActionFilterAttribute

Для того, чтобы облегчить для вас реализацию пользовательского фильтра действий, ASP.NET mVC фреймворк включает базовый ActionFilterAttribute класс. Этот класс реализует IActionFilter интерфейсы и IResultFilter наследует Filter от класса.

Терминология здесь не совсем последовательна. Технически класс, наследуетший из класса ActionFilterAttribute, является как фильтром действия, так и фильтром результата. Однако в свободном смысле фильтр действия слова используется для обозначения любого типа фильтра в ASP.NET mVC.

Базовый ActionFilterAttribute класс имеет следующие методы, которые можно переопределить:

В следующем разделе мы увидим, как можно реализовать каждый из этих различных методов.

Создание фильтра действий в журнале

Чтобы проиллюстрировать, как можно создать пользовательский фильтр действий, мы создадим пользовательский фильтр действий, который регистрирует этапы обработки действия контроллера в окно Visual Studio Output. Наш LogActionFilter содержится в листинге 2.

Рисунок 02: Запись в окно вывода visual Studio (Нажмите, чтобы просмотреть полноразмерное изображение)

Сводка

В этом учебнике вы познакомились с ASP.NET фильтров действий MVC. Вы узнали о четырех различных типах фильтров: фильтры авторизации, фильтры действий, фильтры результатов и фильтры исключений. Вы также узнали ActionFilterAttribute о базовом классе.

Наконец, вы узнали, как реализовать простой фильтр действий. Мы создали фильтр действия журнала, который регистрирует этапы обработки действия контроллера в окно Visual Studio Output.

Источник

Understanding Action Filters (VB)

Understanding Action Filters

You also can create your own custom action filters. For example, you might want to create a custom action filter in order to implement a custom authentication system. Or, you might want to create an action filter that modifies the view data returned by a controller action.

In this tutorial, you learn how to build an action filter from the ground up. We create a Log action filter that logs different stages of the processing of an action to the Visual Studio Output window.

Using an Action Filter

An action filter is an attribute. You can apply most action filters to either an individual controller action or an entire controller.

For example, the Data controller in Listing 1 exposes an action named Index() that returns the current time. This action is decorated with the OutputCache action filter. This filter causes the value returned by the action to be cached for 10 seconds.

Listing 1 – Controllers\DataController.vb

If you repeatedly invoke the Index() action by entering the URL /Data/Index into the address bar of your browser and hitting the Refresh button multiple times, then you will see the same time for 10 seconds. The output of the Index() action is cached for 10 seconds (see Figure 1).

Figure 01: Cached time (Click to view full-size image)

In Listing 1, a single action filter – the OutputCache action filter – is applied to the Index() method. If you need, you can apply multiple action filters to the same action. For example, you might want to apply both the OutputCache and HandleError action filters to the same action.

In Listing 1, the OutputCache action filter is applied to the Index() action. You also could apply this attribute to the DataController class itself. In that case, the result returned by any action exposed by the controller would be cached for 10 seconds.

The Different Types of Filters

The ASP.NET MVC framework supports four different types of filters:

Filters are executed in the order listed above. For example, authorization filters are always executed before action filters and exception filters are always executed after every other type of filter.

Authorization filters are used to implement authentication and authorization for controller actions. For example, the Authorize filter is an example of an Authorization filter.

Action filters contain logic that is executed before and after a controller action executes. You can use an action filter, for instance, to modify the view data that a controller action returns.

Result filters contain logic that is executed before and after a view result is executed. For example, you might want to modify a view result right before the view is rendered to the browser.

Exception filters are the last type of filter to run. You can use an exception filter to handle errors raised by either your controller actions or controller action results. You also can use exception filters to log errors.

Each different type of filter is executed in a particular order. If you want to control the order in which filters of the same type are executed then you can set a filter’s Order property.

The base class for all action filters is the System.Web.Mvc.FilterAttribute class. If you want to implement a particular type of filter, then you need to create a class that inherits from the base Filter class and implements one or more of the IAuthorizationFilter, IActionFilter, IResultFilter, or ExceptionFilter interfaces.

The Base ActionFilterAttribute Class

In order to make it easier for you to implement a custom action filter, the ASP.NET MVC framework includes a base ActionFilterAttribute class. This class implements both the IActionFilter and IResultFilter interfaces and inherits from the Filter class.

The terminology here is not entirely consistent. Technically, a class that inherits from the ActionFilterAttribute class is both an action filter and a result filter. However, in the loose sense, the word action filter is used to refer to any type of filter in the ASP.NET MVC framework.

The base ActionFilterAttribute class has the following methods that you can override:

In the next section, we’ll see how you can implement each of these different methods.

Creating a Log Action Filter

In order to illustrate how you can build a custom action filter, we’ll create a custom action filter that logs the stages of processing a controller action to the Visual Studio Output window. Our LogActionFilter is contained in Listing 2.

Listing 2 – ActionFilters\LogActionFilter.vb

Figure 02: Writing to the Visual Studio Output window (Click to view full-size image)

The Home controller in Listing 3 illustrates how you can apply the Log action filter to an entire controller class. Whenever any of the actions exposed by the Home controller are invoked – either the Index() method or the About() method – the stages of processing the action are logged to the Visual Studio Output window.

Listing 3 – Controllers\HomeController.vb

Summary

In this tutorial, you were introduced to ASP.NET MVC action filters. You learned about the four different types of filters: authorization filters, action filters, result filters, and exception filters. You also learned about the base ActionFilterAttribute class.

Finally, you learned how to implement a simple action filter. We created a Log action filter that logs the stages of processing a controller action to the Visual Studio Output window.

Источник

Фильтры действий, или Как просто улучшить читаемость кода

Введение

В свободное от работы время я, как и многие другие разработчики, занимаюсь созданием своих приложений, чтобы опробовать самые последние технологии, создать что-то полезное для повседневного использования или просто открыть для себя что-то новое. Одним из таких проектов было веб-приложение, которое обрабатывало данные, введённые пользователем, и планировало выполнение задач, основанных на введённых данных. Так как личные проекты не ограничены во времени, то мне хотелось по возможности избавить проект от всех раздражающих моментов. И одним из таких моментов были повторяющиеся строчки кода в методах контроллера. Я начал искать решение этой проблемы и наткнулся на фильтры. Идея использования фильтров для поддержания чистоты кода показалась мне только интересной и эффективной, но в то же время простой, поэтому я решил поделиться этой информацией с вами.

Роль фильтров в процессе обработки запроса

Сначала обсудим сами фильтры: для чего же они нужны? Фильтры позволяют выполнять определённые действия на различных стадиях обработки запроса в ASP.NET Core. Существуют следующие встроенные фильтры:

Ниже представлена схема, которая показывает, в каком порядке вызываются фильтры в процессе обработки запроса:

Из всех фильтров наиболее полезным в повседневном программировании я нахожу фильтры действий. С их помощью можно вынести повторяющиеся операции и хранить их в одном месте. Далее я приведу примеры, как можно «почистить» код, но сперва расскажу о самих фильтрах действий.

Внутреннее устройство фильтров действий

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

Интерфейс IActionFilter, который нужно реализовать, чтобы создать фильтр действий, существовал ещё в ASP.NET MVC. Он определяет методы OnActionExecuting, который вызывается перед выполнением метода контроллера, и OnActionExecuted, который вызывается сразу после. Ниже представлен пример простейшего фильтра действий, который выводит информацию во время отладки приложения до и после выполнения метода контроллера:

Чтобы использовать вышеуказанный фильтр, его нужно зарегистрировать. Для этого в файле FilterConfig.cs, который находится в папке App_Start, следует добавить следующую строку:

Но гораздо удобнее использовать фильтры как атрибуты. Для этих целей существует абстрактный класс ActionFilterAttribute, который унаследован от класса FilterAttribute, а также реализует интерфейсы IActionFilter и IResultFilter. Таким образом, наш класс можно переписать следующим образом:

Теперь, чтобы применить наш фильтр, мы добавляем его к методу контроллера следующим образом:

Этот способ также удобен тем, что мы можем применять фильтры к определённому методу или к контроллеру целиком, а не регистрировать их глобально.

Фильтры действий в ASP.NET Core

С появлением ASP.NET Core в фильтрах действий произошёл ряд изменений. Кроме интерфейса IActionFilter, теперь имеется ещё и IAsyncActionFilter, который определяет единственный метод OnActionExecutionAsync. Ниже приведён пример класса, реализующего интерфейс IAsyncActionFilter:

В качестве второго параметра методу передаётся делегат ActionExecutionDelegate, с помощью которого вызываются либо следующие по порядку фильтры действий, либо сам метод контроллера.

Применяют такой фильтр так же, как и синхронный:

Также изменения затронули абстрактный класс ActionFilterAttribute: теперь он наследуется от класса Attribute и реализует синхронные и асинхронные интерфейсы для фильтров действий (IActionFilter и IAsyncActionFilter) и для фильтров результатов (IResultFilter и IAsyncResultFilter), а также интерфейс IOrderedFilter.

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

Перейдём непосредственно к случаям, когда лучше использовать фильтры действий. Возьмём, например, ситуацию, когда мы создаём веб-приложение и нам нужно сохранить данные, которые приложение получает с помощью метода POST. Допустим, мы ведём сведения о сотрудниках организации. Чтобы представить данные на сервере, мы используем следующий класс:

С помощью атрибутов валидации мы можем контролировать корректность введённых данных. Следует заметить, что атрибуты со статическими параметрами не всегда удобны для валидации данных — как поля, указывающие на возраст и зарплату сотрудника, в примере выше. В таких случаях лучше создать отдельный сервис, который будет выполнять проверку таких полей, но в рамках этой статьи я решил воспользоваться исключительно атрибутами валидации.

После того как были реализованы методы POST и PUT, мы видим, что оба метода содержат повторяющиеся части кода:

И здесь нам на помощь приходят фильтры действий. Создадим новый фильтр действий и перенесём в него повторяющиеся строки следующим образом:

Теперь удаляем ставшие ненужными части кода и применяем созданный нами атрибут-фильтр:

Теперь код выглядит гораздо компактнее и красивее, но в нашем случае его ещё можно упростить: т.к. в контроллере всего 2 метода и оба используют один и тот же фильтр, то можно применить атрибут непосредственно к контроллеру:

Таким образом, с помощью фильтров действий мы вынесли повторяющиеся отрывки кода. Выглядит это просто. Но что нужно сделать, если в фильтр действий нам необходимо передать зависимость?

Разработчики часто сталкиваются с задачей, когда требуется добавить логирование для определённых методов. Поэтому попробуем добавить в фильтры действий средство логирования, которое будет записывать информацию перед выполнением методов POST или PUT контроллера и сразу после. Наш фильтр будет выглядеть следующим образом:

Теперь мы можем применить этот фильтр либо глобально, либо к конкретной области. Сначала попробуем зарегистрировать его глобально. Для этого нам в Startup.cs следует добавить следующие строки:

Если же нам нужно применить фильтр, например, к определённому методу контроллера, то следует его использовать вместе с ServiceFilterAttribute:

ServiceFilterAttribute является фабрикой для других фильтров, реализующей интерфейс IFilterFactory и использующей IServiceProvider для получения нужного фильтра. Поэтому в Startup.cs нам необходимо зарегистрировать наш фильтр следующим образом:

Запустив проект, мы сможем убедиться, что фильтр действий применился только к тем контроллерам и методам, у которых он указан в качестве атрибута.

Внедрение зависимостей в фильтры действий позволяет создавать удобные атрибуты-утилиты, которые можно легко переиспользовать. Ниже представлен пример фильтра, который проверяет наличие объекта в хранилище по Id и возвращает его, если он есть:

Применить этот фильтр можно так же, как и фильтр из предыдущего примера, с помощью ServiceFilterAttribute.

Фильтры действий раньше очень часто применяли, чтобы заблокировать контент для определённых браузеров на основе информации о User-Agent. На ранних этапах становления веб-разработки многие сайты создавались исключительно для наиболее популярных браузеров, остальные же считались «запрещёнными». Сейчас данный подход является нежелательным, т.к. рекомендуется создавать такую HTML-разметку, которую смогло бы поддерживать большинство браузеров. Тем не менее, в некоторых случаях разработчику важно знать источник запроса. Ниже представлен пример получения User-Agent-информации в фильтре действий:

Стоит, однако, заметить, что вышеуказанный метод имеет ещё один недостаток. Многие браузеры умеют прятать или подделывать значения, указанные в User-Agent, поэтому данный способ не является однозначно достоверным в определении типа пользовательского браузера.

Другой пример применения фильтров действий — локализация. Создадим фильтр, который в зависимости от указанной культуры будет выводить дату в этой культуре. Ниже представлен код, который задаёт культуру текущего потока:

Следующим шагом следует добавить маршрутизацию, которая будет перенаправлять URL с данными культуры на наш контроллер:

Код выше создаёт маршрут с именем localizedRoute, у которого в шаблоне имеется параметр, отвечающий за локализацию. Значение по умолчанию для этого параметра — “en-GB”.

Теперь создадим контроллер с именем DateController, который будет обрабатывать наш запрос, и представление, которое будет отображать локализованную дату. Код контроллера просто возвращает представлению текущую дату:

После того как пользователь перешёл по ссылке localhost:44338/Date, он увидит в браузере следующее:

На скриншоте выше текущая дата представлена с учётом локализации, заданной по умолчанию, т.е. с en-GB. Теперь, если пользователь перейдёт по ссылке, в которой будет явно указана культура, например, en-US, то он увидит следующее:

Таким образом, на этом примере мы можем увидеть, как сделать простую и быструю локализацию.

Источник

Читайте также:  Отделка авто алюминиевыми листами
Онлайн портал
Имя Тип Описание
Canceled bool