return true;
}
return false;
}
}
Существенное достоинство этого класса в том, что уменьшение затрат на вызов действия позволило ускорить вызов в среднем на величину от 5 до 30 % по разным оценкам проведенного нами тестирования. С другой стороны, данный вариант не поддерживает многие стандартные механизмы MVC: фильтры, обработку ошибок, проверку авторизации.
Для использования нового класса FastControllerActionInvoker
нужно присвоить его экземпляр свойству ActionInvoker
необходимого контроллера. Например, используем наш новый класс для контроллера AccountController
стандартного проекта MVC:
public AccountController()
: this(null, null)
{
ActionInvoker = new FastControllerActionInvoker();
}
Атрибуты ActionMethodSelectorAttribute
Мы рассмотрели работу механизма ControllerActionInvoker
, который призван найти и выполнить необходимое действие контроллера. Одной из особенностей этого поиска является поиск установленных для действий атрибутов типа ActionMethodSelectorAttribute
. Эти атрибуты имеют одно-единственное предназначение — определение того, может ли быть вызвано это действие в данном контексте запроса или нет. Рассмотрим определение класса ActionMethodSelectorAttribute
:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false,
Inherited = true)]
public abstract class ActionMethodSelectorAttribute : Attribute {
public abstract bool IsValidForRequest(
ControllerContext controllerContext,
MethodInfo methodInfo);
}
Как вы видите, атрибут содержит только один метод IsValidForRequest
, который возвращает булево значение, определяющее, может ли быть вызвано помеченное действие. Этот атрибут очень полезен для обеспечения безопасности, т. к. позволяет "спрятать" часть методов от любой возможности неправомерного использования.
Для удобства разработчиков MVC Framework уже реализует два атрибута, наследующих от ActionMethodSelectorAttribute
:
□ AcceptVerbsAttribute
— позволяет задать для действия допустимые типы HTTP-запросов из следующего списка: GET, POST, PUT, DELETE, HEAD . Запросы, отличные от указанных, будут игнорироваться;
□ NonActionAttribute
— позволяет пометить метод, не являющийся действием. Такой метод невозможно будет вызвать никаким внешним запросом.
Используем эти атрибуты для нашего контроллера AdminController
. Так как действия Index, Select
и Delete
могут быть вызваны только GET-запросами, пометим их соответствующим атрибутом, как показано в следующем фрагменте:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index()
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Delete(Guid? userId)
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Select(Guid? userId)
Наоборот, действие Update вызывается только POST-запросами, поэтому пометим их следующим образом:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Update(Guid? userId, string email,
bool isApproved, bool isLockedOut);
Теперь, если мы попытаемся вызвать действие Update
из строки запроса браузера, набрав URL вроде такого http://localhost:5434/Admin/Update, то получим ошибку с сообщением о том, что страница не была найдена. Без атрибута AcceptVerbs метод был бы вызван.
Для демонстрации действия атрибута NonActionAttribute
проведем некоторые изменения в нашем коде. Обратите внимание на то, что в методах класса ActionController
повторяется следующий код:
User.IsInRole("Administrators")
Вынесем его в отдельный метод UserlsAdmin
:
[NonAction]
private bool UserIsAdmin()
{
return User.IsInRole(''Administrators");
}
Обратите внимание, что мы пометили этот метод атрибутом NonAction
, который указывает на то, что данный метод не является действием и не может быть выбран механизмом MVC при поиске в контроллере необходимого действия.
Атрибуты, производные от FilterAttribute
Когда механизм MVC находит необходимое для вызова действие, производится поиск и выполнение ряда атрибутов, которые являются производными от атрибута FilterAttribute
. Такие атрибуты называются фильтрами и в основном предназначены для проверки прав вызова и безопасности контекста запроса. MVC Framework содержит ряд таких атрибутов, которые вы можете использовать в своих проектах:
□ AuthorizeAttribute
— позволяет указывать ограничения для имен пользователей и ролей, которые могут вызвать данное действие;
□ HandleErrorAttribute
— позволяет определять действия для обработки необработанных исключений;
□ ValidateAntiForgeryTokenAttribute
— проверяет контекст запроса на соответствие указанному маркеру безопасности при получении данных из форм;
Читать дальше
Конец ознакомительного отрывка
Купить книгу