Опубликован: 30.01.2013 | Уровень: для всех | Доступ: платный
Лекция 7:

Возможности расширения приложений ASP.NET

Расширения в рамках приложений ASP.NET MVC Framework

Платформа ASP.NET MVC Framework имеет ряд собственных механизмов, упрощающих расширение функциональности приложения. Расширение возможностей приложения ASP.NET MVC Framework обычно осуществляется за счет наличия в структуре ASP.NET MVC Framework объектов ActionResult и ActionFilter.

Как известно из принципа работы приложения на базе ASP.NET MVC Framework, процесс обработки запроса представляется следующей последовательностью:

  • определяется подходящий маршрут в соответствии с таблицей маршрутов;
  • создается нужный контроллер и выбирается его действие;
  • контроллер производит все необходимые действия по обработке запроса;
  • контроллер выбирает представление;
  • представление генерирует пользовательский интерфейс.

В момент, когда контроллер выбирает представление, он создает объект, унаследованный от класса ActionResult. Этот класс является базовым классом для любых представлений ASP.NET MVC Framework. Фактически, каждое представление является объектом .NET Framework, унаследованным от ActionResult. Так, например, для генерации представления на основе предопределенных шаблонов ASPX используется стандартный объект ViewResult, являющийся наследником объекта ActionResult.


Такой подход позволяет очень гибко подойти к формированию представлений. Например, если в какой-то ситуации требуется сформировать представление, отличное от стандартного, можно создать собственный объект, унаследованный от ActionResult и определить в нем логику генерации представления.

Хорошим примером расширения стандартных возможностей ASP.NET MVC Framework на основе переопределения представления является создание объекта, который генерирует RSS-ленту для приложения. В этом случае необходимо создать собственный объект и унаследовать его от ActionResult. При этом следует переопределить единственный метод базового класса ActionResult – ExecuteResult. Этот метод должен содержать все логику по формированию представления. Метод ExecuteResult принимает единственный параметр типа ControllerContext. В нем содержаться все данные, которые нужны для обработки запроса. К таким данным относится информация о контроллере, инициировавшем генерацию представления, данных о маршрутизации, а также все стандартные объекты ASP.NET, такие как Request, Response и т.д. Для передачи сгенерированного представления клиенту используется объект Response и его метод Write. Так, например, объект по генерации RSS-представления данных может иметь следующую реализацию.


В этом примере объект определенный нами RssView имеет конструктор, в котором принимает исходные данные. После этого в методе ExecuteResult происходит формирование XML-представления в соответствии со спецификацией RSS и передача результата клиенту.

После подобного определения объекта, отвечающего за формирование представление его необходимо использовать в рамках метода контроллера. Для этого необходимо вернуть объект определенного ранее класса RssView в качестве результата.


Это все, что необходимо сделать для определения собственного механизма по формированию представления. Аналогичным образом можно определить и другие объекты по формированию представления и использовать их по своему усмотрению. Как видно, для внедрения в инфраструктуру формирования представлений ASP.NET MVC Framework не требуется глубоко исследовать реализацию ASP.NET MVC Framework.

Другим важным механизмом расширения функциональности приложений ASP.NET MVC Framework являются фильтры действий контроллера – ActionFilter. С точки зрения конструкции языка C#, фильтры являются атрибутами, которыми помечаются действия контроллера. При этом существует возможность перехватить обработку действия контроллера и внедрить туда свою логику.

ASP.NET MVC Framework в своем составе уже имеет ряд важных фильтров, которые позволяют упростить разработку. К таким фильтрам относится, например, фильтр AcceptVers, который позволяет ограничить доступ к действию контроллера для определенных HTTP-методов. Например, в следующем примере обратиться к действию контроллера можно только используя HTTP-метод GET. Запросы, использующие другие HTTP-методы (POST, PUT, HEAD и т.д.) будут игнорироваться.


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


Более того, фильтр Authorize позволяет явно указать имена пользователей или набор групп пользователей, которым разрешен доступ к этому действию контроллера.


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


Каким образом реализуется функциональность фильтров? Для создания фильтра следует создать собственный класс, который является наследником базового класса ActionFilterAttribute. После этого можно переопределить два главных метода базового класса – OnActionExecuting и OnActionExecuted.


Два этих метода позволяют перехватить действия непосредственно перед и после выполнения действия. Таким образом, в этот момент времени можно определить собственную логику, например, в соответствии с какими-либо условиями ограничить доступ к действию контроллера или переопределить имя текущего представления. Как видно, каждый метод в качестве параметра принимает объект типа ActionFilterExecuting или ActionFilterExecuted соответственно. Эти методы содержат все необходимые данные для обработки текущего запроса.

Таким образом, ASP.NET MVC Framework содержит два важных и мощных инструмента для гибкого расширения функциональности веб-приложений.

Краткие итоги

Инфраструктура ASP.NET MVC Framework содержит дополнительные механизмы для расширения функциональности веб-приложения. К таким механизмам относятся возможность переопределения логики формирования представления на основе объекта ActionResult и фильтры ActionFilter. Создав собственную логику формирования представления на основе ActionResult можно удобно использовать ее при выполнении действия контроллера. Фильтры ASP.NET MVC Framework позволяют определить дополнительные правила при выполнении действия контроллера путем перехвата момента перед и после выполнения действия контроллера.

Контрольные вопросы

  • Как работают HTTP-модули?
  • Каким образом создаются и инициализируются объекты HTTP-модулей?
  • Что необходимо сделать для разработки собственного HTTP-модуля?
  • Какими преимуществами обладают HTTP-модули перед другими средствами расширения функциональности?
  • Что такое HTTP-обработчики?
  • Для каких целей нужны HTTP-обработчики?
  • Что необходимо сделать для разработки HTTP-обработчика?
  • Что такое асинхронные HTTP-обработчики?
  • Какими дополнительными возможностями расширения функциональности приложения обладает платформа ASP.NET MVC Framework?
  • Для чего необходим объект ActionResult и в каких ситуациях удобно расширять функциональность приложения на основе этого механизма?
  • Что такое фильтры ASP.NET MVC Framework?
  • Каким образом работают объекты ActionFilter в ASP.NET MVC Framework?
Марина Воробьева
Марина Воробьева
Виктория Ткаченко
Виктория Ткаченко

Проигрыватель не работает. После нажатия кнопки Play ничего не происходит.

Азиз Рахимов
Азиз Рахимов
Россия, М/О Ленинская район г.Видное ул.Центральная д.32
Борис Логунов
Борис Логунов
Россия, Moscow