Многие, в том числе и я, достаточно долго ждали выхода финальной версии .NET Core и ASP.NET Core и конечно дождались. Всего пару месяцев назад была выпущена RTM версия технологии для разработки веб приложений, получившая название ASP.NET Core 1.0. Напомню, что ещё в начале текущего года именовалась она как ASP.NET 5. Продалжая данный цикл статей, в детали темы. Всё самое новое, то, что сегодня может предоставить новейшая версии платформы Microsoft .NET, в общих чертах, было уже описано. Что ещё мы получим используя последнюю версию платформы .NET, а также более развёрнутое описание технологий веб-разработки, которые предлагает нам Microsoft сегодня будет дано далее и в последующих статьях. Достаточно открыть Visual Studio 2015 Update 3 с последней на данный момент версией Microsoft ASP.NET and Web Tools (VS2015Tools.Preview2.0.1), чтобы увидеть всё, что доступно нам уже сегодня.

Image 1

Из вышеприведённого изображения видно, что существует целых две категории шаблонов для ASP.NET приложений, для новейшей версии ASP.NET Core 1.0 и обновлённой – ASP.NET 4.5.1, которая официально получила номер ASP.NET 4.6. Насчёт последней цифры в версии было много споров, выбор был между номерами 4.5.3 и 4.6, в конце, на основе мнений большинства, остановились на последней. Разработчик, имеющий опыт работы с предыдущими версиями платформы наверняка в первую очередь продумает, что данный шаблон сделан для совместимости и для сопровождения предыдущих версий технологии. По крайней мере так было всегда, вспомним Visual Studio 2010/2012/2013. Так ли это? Отчасти, да. Но, с большими оговорками: помните рисунок из предыдущей статьи? Если оставить только содержимое для веба, то получи примерно следующее:

Image2

Получается, что существует целых две актуальных технологии для разработки веб-приложений сегодня: ASP.NET 4.6 и ASP.NET Core 1.0, которые нам предлагает Microsoft. Детальное описание новейшей версии – ASP.NET Core будет дано в последующих статьях, в данной сравним обе друг с другом. Для начала посмотрим что нам может предложить обновлённая версия ASP.NET 4.5.1? Давайте переместимся немного назад, а именно в год 2013-ый, когда состоялся релиз Visual Studio 2013. Если кто помнит, тогда мы не получили ничего абсолютно нового в плане глобальных изменений. Да, была реализована так называемая идея объединения технологий Web Forms, MVC и Web API, получившая официальное название «Единый ASP.NET» (“One ASP.NET”), но она немножко припозднилась, точнее могли раньше сделать, ничего этому не мешало, но не делали. Конечно, технологии и библиотеки были обновлены, но в глобальном плане ничего революционного не было, за исключением новой идеи – «OWIN» и её реализации «Katana». Для получения большей информации насчёт последних рекомендую ознакомиться с циклом статей «Microsoft OWIN и конвейер обработки запросов ASP.NET». А что по сути дал нам OWIN в ASP.NET 4.5.1, ровным счётом ничего полезного. Единственное – конвейер усложнился ещё больше, хотя и без того был сложным. А сложность не является оправданной, если не приносит никакой пользы. В нижнем рисунке видна схема конвейеров, поставленная рядышком: слева – обычный конвейер ASP.NET/IIS, посередине тот же конвейер, но уже по спецификации OWIN, по сути их там два и правый – конвейер без IIS и ASP.NET.В частности можно увидеть насколько конвейер OWIN без IIS простой и легковесный (файл рисунка в более высоком разрешении можно взять отсюда).

Image3

Но почему спецификация OWIN была бесполезной и не принесла ничего нового и существенного. Просто её реализация тогда ещё была далека от совершенства, это же было началом конца монополии IIS для ASP.NET (Нужны ли нам ASP.NET и IIS?). Применение данной спецификации на IIS, как уже отметил выше не было полезным, а использование вне – затруднительным. Почему затруднительным? Да, потому, что насколько хорошей бы не была идея, её ещё нужно реализовать и «обкатить» как следует. Конечно, появилась возможность хостинга приложения вне IIS, но использовать свой сервер или хост (Self-Host) уровня обычного консольного приложения попросту неразумно для серьёзных приложений. Может мы чем-то не довольны в IIS, но все те средства администрирования (управление, диагностика, логирование и т.п.) сервера, весь тот опыт (багаж знаний) который есть уже, с этим нельзя не считаться. Всё же, именно дальнейшее развитие спецификации OWIN легло в основу ASP.NET Core. Несмотря на всё это ASP.NET 4.5.1 была обновлена и получила новую версию – ASP.NET 4.6. Следует отметить, что под ASP.NET 4.6 подразумевается весь следующий спектр технологий: Web Forms, MVC 5.x, Web API 2.x и SignalR 2.x. И на этот раз Microsoft не прекратила поддержку уже «устаревшей» технологии, а наоборот добавила очень много всего интересного и полезного. Ниже перечислен список самых важных нововведений.

Поддержка протокола HTTP/2.

Новая версия протокола HTTP добавлена в ASP.NET и в .NET Framework 4.6. Для использования HTTP/2 с ASP.NET приложение должно выполняться в Windows 10 или Windows Server 2016, важен не номер ОС, а версия IIS нужен IIS 10 или выше. Важно отметить, что пока ещё, на момент написания статьи, поддержка HTTP/2 не добавлена в ASP.NET Core, в будущем появится обязательно. HTTP/2 — это новая версия протокола HTTP, которая обеспечивает более эффективную коммуникацию (меньшее число циклов передачи-подтверждения между клиентом и сервером) и уменьшение задержки при загрузке веб-страницы для пользователей. HTTP/2 обеспечивает максимальное преимущество для веб-страниц (по сравнению со службами), так как оптимизирует запрос различных артефактов в ходе одной операции. Всю работу выполняют браузер и веб-сервер (IIS в Windows). Нет необходимости перекладывать нагрузку на пользователей. Большинство основных браузеров (новые версии) поддерживают HTTP/2, поэтому вполне вероятно, что пользователи смогут воспользоваться преимуществами протокола HTTP/2, если его поддерживает сервер. Более подробно о новом протоколе, к примеру, можно узнать по этой ссылке на Channel 9. На мой взгляд это очень существенное обновление для ASP.NET 4.6.

Добавлена поддержка .NET Compiler Platform (“Roslyn”) в ASP.NET.

По мне, ещё одно существенное улучшение. Чтобы не быть многословным, отмечу самое ванное преимущество, которое мы получаем, используя Roslyn это – скорость компиляции. Вдобавок ко всему и новые возможности языков программирования, хотя я их считаю пока ещё мало полезными. Для получения больших сведений на данный счёт можете взглянуть, например, сюда.

Прочие улучшения и обновления в ASP.NET 4.6.

Далее перечислен список менее значимых, хотя вполне себе полезных улучшений и обновлений. Были обновлены MVC 5 и Web API 2 до версии 5.2.3, сделаны мелкие улучшения и исправления ошибок. Добавлена асинхронная модель привязки в Web Forms, были обновлены элементы управления для поддержки Entity Framework 6 и обновлена библиотека Ajax Control Toolkit. Полный перечень всего вышесказанного можно найти в данной статье. Также следует отметить ещё одно улучшение, не относящееся непосредственно к платформе ASP.NET 4.6, но используемое ею, это – новый 64-разрядный JIT компилятора. В .NET Framework 4.6 представлена новая версия компилятора JIT, который имеет значительно большую производительность, чем существующий 64-разрядный компилятор JIT. Из всего вышеперечисленного видно, что изменений и улучшений не мало, что делает платформу ASP.NET 4.6 вполне себе актуальной на сегодняшний день. И конечно, улучения будут и в будущем.

А что насчёт новейшей версии – ASP.NET Core?

Кратко перечислю основные значимые особенности, которые более детально будут описаны в последующих статьях. Намного более быстрая и легковесная среда выполнения. Возможность хостинга приложений где и как вам удобно, больше нет жёсткой привязки к IIS, хотя данная возможность появилась немного раньше, но была не совсем удобной и доработанной, как уже отметил выше. Полная модульность благодаря ключевым изменениям и .NET Core. Кроссплатформенность (возможность хостинга приложений вне Windows, а в данном случае это Linux и Mac OS), как бы широко не рекламировалась, лично по мне это не ключевое изменение, хотя могу ошибаться. Трудно представить разработчика, использующего всё, и вся от Microsoft переходящего с ASP.NET на другую ОС. Хотя вполне реально, что разработчики использующие другие платформы будут использовать ASP.NET Core вне Windows. Конечно есть альтернативные и не мене достойные веб-технологии и там. Далее, возможность конфигурирования и развёртывания намного упрощена, но разработчику долгое время работавшему с XML трудно и непривычно переходить на JSON. Хотя JavaScript библиотеки и платформы уже вовсю используют подход на основе JSON и поэтому иметь подобное на серверной стороне всё же намного удобней. Иметь единый стек как для интерфейса пользователя (Web UI), так и для API намного разумней, нежели два. Правда, на мой взгляд, задача была тогда отвязать и сделать отдельную технологию для создания служб HTTP, которую можно было бы развивать отдельно от ASP.NET/IIS, но это как видно не очень-то получилось. Также были добавлены новые средства, которые упрощают процесс диагностики приложения (об этом будет отдельная статья). Всё перечисленное выше делает приложения на ASP.NET Core более «дружественным к облаку» (Cloud Optimized ASP.NET), а как известно облачные технологии уже сегодня имеют большую роль и будут иметь ещё большую в будущем. И наконец отмечу, что все перечисленные изменения появились благодаря тому, что платформа была переписана почти с нуля, благодаря уже имеющемуся опыту и сегодняшним требованиям, а это уже о многом говорит.

Название моей прошлогодней статьи «Microsoft ASP.NET vNext: эволюция или революция?» звучит слишком громко, но это вполне оправдано, если смотреть с точки зрения проделанной работы (которая на мой взгляд могла быть сделана и намного раньше), т.е. разницы с предыдущей. Да всё хорошо и замечательно, у нас много всего нового, но что нам, всем тем, кто использует данную платформу, даст новейшая технология? Ведь опыт показывает, что для построения «правильных» приложений технология уходит на второй план и в большинстве случаем не играет ключевую роль. То есть, если разработанное приложение не решает или решает плохо поставленные задачи, тогда никакая супер-мега технология, в подавляющем большинстве случаев, легко и просто не поможет кардинально исправить ситуацию. Если лет пять назад на так называемых «front-end» (замечу что под данным термином в данном случае я подразумеваю не верстальщика, а разработчика, уверенно владеющего JavaScript и разного рода библиотеками и технологиями на JavaScript) разработчиков смотрели косо, то ситуация сегодня совсем другая. Разрабатывать на JavaScript ничуть не легче и проще, а порой и ещё сложнее. JavaScript– это «душа» веба сегодня, нельзя с этим не считаться. Хотим мы того или нет, но подход, при котором HTML генерировался на сервере с помощью серверных технологий всё больше становится менее популярным, и это неизбежно и тому есть причина. Веб-приложение сегодня – это нечто намного и намного большее, чем было скажем лет десять назад. В свою очередь это влечёт за собой сложность, которая становится неоправданно высокой, если использовать серверные технологии, такие как ASP.NET Web Form или ASP.NET MVC для реализации логики работы сложного и интерактивного приложения на клиенте, вместо того же JavaScript. До сегодняшнего дня Visual Studio ничего близкого не могла предложить по сравнению, например, с тем же WebStorm (разработчики у кого есть опыт работы с WebStorm меня поймут) с точки зрения «front-end» разработки. А использовать приложение ASP.NET исключительно как сервисный слой не всегда разумно, учитывая альтернативные технологии. С приходом ASP.NET Core ситуации меняется, жаль, что не раньше, хотя функционал по работе с SPA и не только, по сравнению с WebStorm, на мой взгляд, пока ещё ограничен. Да, может я слишком критичен в последних приложениях, можно было бы обойтись существующими возможностями Visual Studio, но это жутко неудобно. К примеру, если взять тот же Gulp или Grunt, до Visual Studio 2015 и ASP.NET Core встроенных средств для работы с ними не было. Поэтому не может не радовать факт наличия много всего нового в ASP.NET Core. И так, будем прагматичны, имея две технологии для веб-разработки неизбежно возникнет вопрос:

Что нам следует сделать, каков наш выбор?

Выбор в данном случае не простой. Если у вас классическое приложение ASP.NET Web Forms и много свободных ресурсов (денег) – мигрируйте на ASP.NET Core. В случае ограниченных ресурсов, советую вам проделать постепенную миграцию до ASP.NET 4.6. Используя идею «Единый ASP.NET» это можно сделать поэтапно, где-то оставить старый код, где-то MVC, а в частях где производительность критична на клиенте и сервере тоже – подход с одностраничным приложением (SPA), например, используя AngularJS. Я со своими разработчиками делал подобное, есть опыт миграции корпоративных веб-порталов с ASP.NET 3.5 на ASP.NET 4.6. И скажу вам, что это не так просто, как вначале казалось, слишком много подводных камней (вот один из многих) было, отчасти зависящих также и от качества кода. Ну а если ваш код не удовлетворяет вашим потребностям, то тут стоит задуматься именно над этим, а не о технологии или платформе. В том случае, если у вас приложение ASP.NET MVC, переходить на ASP.NET Core стоит в двух случаях: у вашего приложения проблемы с производительностью (вы сделали всё, дальше ничего оптимизировать невозможно) или у вас много денег свободного времени. В противном случае нужно улучшать свой код. Бывают случаи, когда код сильно завязан на System.Web.dll и IIS, это тоже весомый повод ничего не трогать. Ну и последний случай, если ASP.NET используется исключительно в виде веб-сервисов, например, в случае с Web API. Примером тому могут быть одностраничные приложения (SPA) или распределённые, которые могут и не иметь отношения к HTML. В подобном случае перейти на новую версию будет намного легче, чем в предыдущих. Опять-таки, если вас всё устраивает, то переходить на ASP.NET Core незачем. Почти во всех случаях, достаточно легко и быстро обновить .NET Framework до версии 4.6 и жить спокойно. Я знаю приложения и людей, которые используют всё ещё классический ASP и пока ещё их это устраивает. Если вы не довольны производительностью Web API и IIS, то это тоже повод для обновления на ASP.NET Core.

Теперь осталось попытаться дать однозначный ответ на главный вопрос, так каков же наш выбор: ASP.NET 4.x или ASP.NET Core? Однозначного ответа нет, зависит от… И выбор за вами, однако, нужно помнить, что будущее за ASP.NET Core и рано или поздно оно наступит.