□ определяет атрибуты по умолчанию для обработки ошибок и сжатия результатов через GZip;
□ определяет обертку Settings
над секцией настроек appSettings
файла web.config, для более прозрачного доступа к настройкам;
□ прямо определяет UserNotFoundMessage
, одну из настроек секции appSettings
для быстрого к ней доступа;
□ определяет упрощенный доступ к объекту Membership.Provider
;
□ определяет статический метод для более простого доступа к данным пользователей.
Чтобы наделить этими свойствами любой контроллер, необходимо наследовать его от базового. Модифицируем контроллер AdminController
согласно новым правилам так, как показано во фрагменте:
public class AdminController : BaseController {
[AcceptVerbs(HttpVerbs.Get)]
[Authorize(Users = "Admin")]
public override ActionResult Index()
{
int userCount;
var users = MP.GetAllUsers(0, Int32.MaxValue, out userCount);
ViewData.Model = users;
return View();
}
[AcceptVerbs(HttpVerbs.Get)]
[Authorize(Users = "Admin")]
public ActionResult Select(Guid? userId)
{
if (!userId.HasValue)
throw new HttpException(404, UserNotFoundMessage);
return View("Select", "Site", GetUser(userId.Value));
}
}
Обратите внимание, класс контроллера наследует BaseController
, в связи с этим действие Index
переопределяется с помощью ключевого слова override
. Кроме того, в Index
используется новое свойство mp, определенное в базовом контроллере. В другом действии, Select
, используются два других функционала базового контроллера: свойство UserNotFoundMessage
и статический метод GetUser
.
Использование базовых контроллеров позволяет гибко определять базовую логику для других контроллеров. Создав однажды базовый контроллер с набором функций, впоследствии, при создании других контроллеров, вы можете наследовать эти функции, просто определяя базовый контроллер для каждого нового контроллера.
Асинхронное выполнение при работе с контроллерами
При создании веб-приложений часто может возникнуть проблема с обработкой данных, которая отнимает большие ресурсы и машинное время. Механизм ASP.NET имеет ограниченное количество потоков, которые предназначены для обработки пользовательских запросов, полученных от сервера IIS. Проблема состоит в том, что если один из запросов предполагает продолжительную работу с привлечением больших ресурсов, то такой запрос может уменьшить пропускную способность сайта. В случаях, когда таких запросов много, их выполнение может вообще заблокировать доступ пользователей к ресурсу, т. к. все рабочие потоки ASP.NET будут заняты, простаивая в ожидании того, когда завершится выполнение тяжелого запроса к базе данных или сложное вычисление.
Выходом из такой ситуации может служить асинхронное выполнение запросов. При асинхронном выполнении тяжелая задача поручается для выполнения отдельному специально созданному потоку, а основной поток ASP.NET освобождается для обработки других пользовательских запросов. Для реализации такого функционала разработчиками MVC Framework был создан специальный механизм AsyncController
, который хоть и не вошел в MVC Framework, но доступен в особой библиотеке MVC Framework Futures, которая представлена файлом Microsoft.Web.Mvc.dll.
Примечание
Саму библиотеку и документацию к ней на английском языке можно скачать с официальной страницы ASP.NET MVC на сайте Codeplex по следующему адресу: http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471
******************************
После добавления ссылки на сборку в проект, для того чтобы использовать асинхронные контроллеры, необходимо проделать некоторые изменения в существующем коде. Первым делом нужно изменить регистрации маршрутов в таблице маршрутизации так, как показано в следующем фрагменте:
routes.MapAsyncRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" }
);
Обратите внимание на то, что вызов routes.MapRoute
заменен на routes.MapAsyncRoute
, это необходимо, чтобы механизм MVC мог обрабатывать как асинхронные, так и синхронные контроллеры. После изменений в регистрации маршрутов нет нужды в других изменениях, чтобы специально отслеживать синхронные контроллеры, поскольку механизм MapAsyncRoute
регистрирует маршруты как для асинхронных, так и синхронных контроллеров.
После изменения регистрации маршрутов следует изменить обработчики для *.mvc, определенные ранее в web.config, следующим образом в разделах httpHandlers
и handlers
:
type="System.Web.Mvc.MvcHttpHandler,
Читать дальше
Конец ознакомительного отрывка
Купить книгу