Чтение онлайн

на главную - закладки

Жанры

Шрифт:

{

MembershipProvider mp = Membership.Provider;

return mp.GetUser(userName, false);

}

public static MembershipUser GetUser(Guid userId)

{

MembershipProvider mp = Membership.Provider;

return mp.GetUser(userId, false);

}

}

Базовый контроллер из листинга 4.7 обладает следующими свойствами:

? определяет для контроллера действие по умолчанию Index;

? определяет атрибуты по умолчанию для обработки ошибок и сжатия результатов через 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:

<add verb="*" path="*.mvc" validate="false"

type="System.Web.Mvc.MvcHttpHandler,

System.Web.Mvc, Version=1.0.0.0,

Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

<add name="MvcHttpHandler" preCondition="integratedMode"

verb="*" path="*.mvc" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc,

Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

Эти определения обработчиков необходимо заменить на следующие:

<add verb="*" path="*.mvc" validate="false"

type="Microsoft.Web.Mvc.MvcHttpAsyncHandler, Microsoft.Web.Mvc"/>

<add name="MvcHttpHandler" preCondition="integratedMode"

verb="*" path="*.mvc" type="Microsoft.Web.Mvc.MvcHttpAsyncHandler,

Microsoft.Web.Mvc"/>

После всех изменений можно приступать к работе с асинхронными контроллерами. Для того чтобы класс контроллера стал асинхронным, необходимо наследовать его от класса AsyncController:

Поделиться:
Популярные книги

Кодекс Охотника. Книга XVII

Винокуров Юрий
17. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVII

Я — Легион

Злобин Михаил
3. О чем молчат могилы
Фантастика:
боевая фантастика
7.88
рейтинг книги
Я — Легион

Я бог. Книга XXXIX

Дрейк Сириус
39. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я бог. Книга XXXIX

Оборотень

Сухов Евгений Евгеньевич
10. Я – вор в законе
Детективы:
боевики
5.89
рейтинг книги
Оборотень

Кодекс Охотника XXVIII

Винокуров Юрий
28. Кодекс Охотника
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Охотника XXVIII

Жертва

Привалов Сергей
2. Звездный Бродяга
Фантастика:
боевая фантастика
космическая фантастика
рпг
попаданцы
6.25
рейтинг книги
Жертва

Монстр из прошлого тысячелетия

Еслер Андрей
5. Соприкосновение миров
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Монстр из прошлого тысячелетия

Обреченная

Макдевит Джек
2. Космоархеологи
Фантастика:
научная фантастика
7.00
рейтинг книги
Обреченная

Старый, но крепкий 2

Крынов Макс
2. Культивация без насилия
Фантастика:
рпг
уся
эпическая фантастика
5.00
рейтинг книги
Старый, но крепкий 2

Газлайтер. Том 23

Володин Григорий Григорьевич
23. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.25
рейтинг книги
Газлайтер. Том 23

Эфемер

Прокофьев Роман Юрьевич
7. Стеллар
Фантастика:
боевая фантастика
рпг
7.23
рейтинг книги
Эфемер

Хозяин зеркал

Зонис Юлия
Фантастика:
социально-философская фантастика
7.57
рейтинг книги
Хозяин зеркал

Аввакум

Бахревский Владислав Анатольевич
Проза:
историческая проза
7.00
рейтинг книги
Аввакум

Печать мастера

Лисина Александра
6. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
фэнтези
6.00
рейтинг книги
Печать мастера