Microsoft наращивает циклы выпуска некоторых своих продуктов, и феноменальная скорость обновления среды ASP.NET MVC является тому подтверждением.
Последняя версия, MVC 4 Developer Preview, содержит несколько интересных дополнений к своему арсеналу. В течение следующих нескольких недель я рассмотрю некоторые новые возможности фреймворка и то, как вы можете использовать их на своем веб-сайте.
Более заметные функции, добавленные в платформу, включают в себя:
- Шаблоны мобильных проектов
- Режимы отображения
- Рецепты
- Поддержка задач для асинхронных контроллеров
- Azure SDK
- Исправление ошибок
Установка
Прежде чем приступить к разработке, вам необходимо установить сборки MVC 4. Самый простой способ сделать это через установщик веб-платформы. MVC 4 доступен для Visual Studio 2010 или Visual Studio 2011 Developer Preview. Все статьи MVC, которые я создаю, разработаны в Visual Studio 2011 Developer Preview. Ниже приведены ссылки для начала.
- ASP.NET MVC 4 для Visual Studio 2010
- Предварительный просмотр ASP.NET MVC 4 для Visual Studio 2011 для разработчиков
После того, как вы все установили, веселье действительно начинается!
Поддержка задач для асинхронных контроллеров
Особенностью, на которой я собираюсь сосредоточиться сегодня, является поддержка задач для асинхронных контроллеров.
Никто не любит ждать, так почему ваши пользователи должны ждать долго выполняемой асинхронной задачи? Это не имеет смысла!
Разработка асинхронных контроллеров была доступна со времен MVC 3, но чтобы это работало, вам пришлось написать кучу дополнительного кода — что я хотел бы назвать шумом кода — чтобы заставить его работать.
Возьмите пример интеграции Twitter в веб-страницу. В MVC 3 код должен был следовать определенным правилам. Вместо одного метода действия должны были быть два метода действия. Оба были названы одинаково, но для метода, начинающего асинхронный запрос, вам нужно было добавить Async к имени действия. Для того, чтобы метод обрабатывал окончание асинхронного запроса, вам нужно добавить Completed к имени действия.
Намного легче следовать, если вы видите некоторый код. Пример кода ниже запрашивает данные из Twitter асинхронно.
public void SearchTwitterAsync () { const string url = "http://search.twitter.com/search.atom?q=guycode&rpp=100&result_type=mixed"; // объявлена асинхронная операция AsyncManager.OutstandingOperations.Increment (); var webClient = new WebClient (); webClient.DownloadStringCompleted + = (отправитель, e) => { AsyncManager.Parameters ["results"] = e.Result; AsyncManager.OutstandingOperations.Decrement (); }; webClient.DownloadStringAsync (новый Uri (url)); // асинхронный процесс запущен } public ActionResult SearchTwitterCompleted (строковые результаты) { // Теперь возвращаем результаты твиттера клиенту вернуть Json (ReadTwitterResults (результаты), JsonRequestBehavior.AllowGet); }
Приведенный выше код отправляется в Twitter, ищет данные и возвращает результаты асинхронно. Там много шума в коде и для меня, он нарушает — из-за отсутствия лучшего слова — принцип « Не повторяйся» (СУХОЙ) .
Ну, в MVC 4 эти задачи были объединены. Теперь вы можете писать асинхронные методы действий как отдельные методы, которые возвращают объект типа Task или Task <ActionResult> .
Эти функции доступны только в MVC 4 или C # 5. Вот упрощенный код ниже.
публичная асинхронная задача <ActionResult> Search () { string url = "http://search.twitter.com/search.atom?q=guycode&rpp=100&result_type=mixed"; var webClient = new WebClient (); string xmlResult = await webClient.DownloadStringTaskAsync (url); return Json (ReadTwitterResults (xmlResult), JsonRequestBehavior.AllowGet); }
Результаты одинаковы, но теперь вы можете уменьшить количество кода, необходимого для достижения того же результата.
Методы асинхронного действия, которые возвращают экземпляры Task, также могут поддерживать тайм-ауты. Чтобы установить ограничение времени для вашего метода действия, вы можете использовать атрибут AsyncTimeout . В следующем примере показан метод асинхронного действия, время ожидания которого составляет 2500 миллисекунд. По истечении времени ожидания пользователю будет отображено представление «TimedOut».
[AsyncTimeout (2500)] [HandleError (ExceptionType = typeof (TaskCanceledException), View = "TimedOut")] публичная асинхронная задача <ActionResult> Search () { string url = "http://search.twitter.com/search.atom?q=guycode&rpp=100&result_type=mixed"; var webClient = new WebClient (); string xmlResult = await webClient.DownloadStringTaskAsync (url); return Json (ReadTwitterResults (xmlResult), JsonRequestBehavior.AllowGet); }
Больше ничего не изменилось с асинхронными действиями.
Контроллер все еще должен быть производным от AsyncController , и вы по-прежнему обращаетесь к действию таким же образом, но вы должны писать меньше кода.
Асинхронные контроллеры идеально подходят для фрагментов кода, которые выполняются с большой длиной. Большую часть времени вы будете работать с базой данных, поэтому возможность совершать обращения к базе данных асинхронно — большой плюс для конечного пользователя.
Почему они должны ждать?
Все примеры кода можно скачать здесь .