<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>MSDR.RU</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/yatajga/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/yatajga/feed.xml</link>
    <description>Данный ресурс посвящён разработке и сопровождению приложений с использованием технологий и продуктов компании Microsoft...</description>
    <lastBuildDate>Wed, 17 Apr 2019 03:30:05 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Платформа ASP.NET Core 1.0. Часть 2: ASP.NET сегодня или что же выбрать?</title>
      <link>https://docs.microsoft.com/archive/blogs/yatajga/asp-net-core-1-0-2</link>
      <pubDate>Sun, 28 Aug 2016 00:34:00 GMT</pubDate>
      <dc:creator><![CDATA[Yatajga]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yatajga/2015/07/15/asp-net-5-2-asp-net-1095/</guid>
      <description><![CDATA[Многие, в том числе и я, достаточно долго ждали выхода финальной версии .NET Core и ASP.NET Core и...]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Многие, в том числе и я, достаточно долго ждали выхода финальной версии .NET Core и ASP.NET Core и конечно дождались. Всего пару месяцев назад была выпущена RTM версия технологии для разработки веб приложений, получившая название <span style="font-family: Arial">ASP.NET Core 1.0.</span> Напомню, что  ещё в начале текущего года именовалась она как ASP.NET 5. Продалжая данный цикл статей,  в детали темы. Всё самое новое, то, что сегодня может предоставить новейшая версии платформы <span style="font-family: Arial">Microsoft</span> .NET, в общих чертах, было уже описано. Что ещё мы получим используя последнюю версию платформы .NET, а также более развёрнутое описание технологий веб-разработки, которые предлагает нам Microsoft сегодня будет дано далее и в последующих статьях. Достаточно открыть Visual Studio 2015 Update 3 с последней на данный момент версией Microsoft ASP.NET and Web Tools (VS2015Tools.Preview2.0.1), чтобы увидеть всё, что доступно нам уже сегодня.</span></p>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2016/08/A74I1.png" />
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Из вышеприведённого изображения видно, что существует целых две категории шаблонов для 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. Так ли это? Отчасти, да. Но, с большими оговорками: помните рисунок из предыдущей статьи? Если оставить только содержимое для веба, то получи примерно следующее:</span></p>
<p style="text-align: justify"><img alt="" src="https://msdnshared.blob.core.windows.net/media/2016/08/A74I2.png" /></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Получается, что существует целых две актуальных технологии для разработки веб-приложений сегодня: ASP.NET 4.6 и ASP.NET Core 1.0, которые нам предлагает Microsoft. Детальное описание новейшей версии – ASP.NET <span style="font-family: Arial">Core</span> будет дано в последующих статьях, в данной сравним обе  друг с другом. Для начала посмотрим что нам может предложить обновлённая версия ASP.NET 4.5.1? Давайте переместимся немного назад, а именно в год 2013-ый, когда состоялся релиз Visual Studio 2013. Если кто помнит, тогда мы не получили ничего абсолютно нового в плане глобальных изменений. Да, была реализована так называемая идея объединения технологий Web Forms, MVC и Web API, получившая официальное название «<a href="https://msdn.microsoft.com/ru-ru/magazine/dn198242.aspx">Единый ASP.NET</a>» (“<a href="https://channel9.msdn.com/Events/Visual-Studio/Launch-2013/WC103">One ASP.NET</a><a href="https://blogs.msdn.com/controlpanel/blogs/posteditor.aspx/&lt;a href=&quot;&quot;&gt;One ASP.NET&lt;/a&gt;&amp;rdquo;">”</a>), но она <a href="https://www.msdr.ru/44/">немножко припозднилась</a>, точнее могли раньше сделать, ничего этому не мешало, но не делали. Конечно, технологии и библиотеки были обновлены, но в глобальном плане ничего революционного не было, за исключением новой идеи – «OWIN» и её реализации «Katana». Для получения большей информации насчёт последних рекомендую ознакомиться с циклом статей «<a href="https://blogs.msdn.com/b/yatajga/archive/2014/12/23/microsoft-owin-asp-net-iis-asp-net-owin.aspx">Microsoft OWIN и конвейер обработки запросов ASP.NET</a>». А что по сути дал нам OWIN в ASP.NET 4.5.1, ровным счётом ничего полезного. Единственное – конвейер усложнился ещё больше, хотя и без того был сложным. А сложность не является оправданной, если не приносит никакой пользы. В нижнем рисунке видна схема конвейеров, поставленная рядышком: слева – обычный конвейер ASP.NET/IIS, посередине тот же конвейер, но уже по спецификации OWIN, по сути их там два и правый – конвейер без IIS и ASP.NET.В частности можно увидеть насколько конвейер <span style="font-family: Arial">OWIN</span> без IIS простой и легковесный (файл рисунка в более высоком разрешении можно <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A74/2337.A74I3H.png">взять отсюда</a>).</span></p>
<p style="text-align: justify"><img alt="" src="https://msdnshared.blob.core.windows.net/media/2016/12/A74I3.jpg" /></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Но почему спецификация OWIN была бесполезной и не принесла ничего нового и существенного. Просто её реализация тогда ещё была далека от совершенства, это же было началом конца монополии IIS для ASP.NET (<a href="https://www.msdr.ru/57/">Нужны ли нам ASP.NET и IIS?</a>). Применение данной спецификации на IIS, как уже отметил выше не было полезным, а использование вне – затруднительным. Почему затруднительным? Да, потому, что насколько хорошей бы не была идея, её ещё нужно реализовать и «обкатить» как следует. Конечно, появилась возможность хостинга приложения вне IIS, но использовать свой сервер или хост (Self-Host) уровня обычного консольного приложения попросту неразумно для серьёзных приложений. Может мы чем-то не довольны в IIS, но все те средства администрирования (управление, диагностика, логирование и т.п.) сервера, весь тот опыт (багаж знаний) который есть уже, с этим нельзя не считаться. Всё же, именно <a href="https://www.msdr.ru/62/">дальнейшее развитие</a> спецификации 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 не прекратила поддержку уже «устаревшей» технологии, а наоборот добавила очень много всего интересного и полезного. Ниже перечислен список самых важных нововведений. </span></p>
<p style="text-align: justify;font-family: arial,helvetica,sans-serif"><strong>Поддержка протокола HTTP/2.</strong></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Новая версия протокола HTTP добавлена в ASP.NET и в .NET Framework 4.6. Для использования HTTP/2 с ASP.NET приложение должно выполняться в Windows 10 или Windows Server 2016, важен не номер ОС, а версия IIS нужен IIS 10 или выше. Важно отметить, что пока ещё, на момент написания статьи, поддержка HTTP/2 не добавлена в ASP.NET <span style="font-family: Arial">Core, в будущем появится обязательно</span>. HTTP/2 — это новая версия протокола HTTP, которая обеспечивает более эффективную коммуникацию (меньшее число циклов передачи-подтверждения между клиентом и сервером) и уменьшение задержки при загрузке веб-страницы для пользователей. HTTP/2 обеспечивает максимальное преимущество для веб-страниц (по сравнению со службами), так как оптимизирует запрос различных артефактов в ходе одной операции. Всю работу выполняют браузер и веб-сервер (IIS в Windows). Нет необходимости перекладывать нагрузку на пользователей. Большинство основных браузеров (новые версии) поддерживают HTTP/2, поэтому вполне вероятно, что пользователи смогут воспользоваться преимуществами протокола HTTP/2, если его поддерживает сервер. Более подробно о новом протоколе, к примеру, можно узнать по <a href="https://channel9.msdn.com/events/Build/2015/3-88">этой ссылке</a> на Channel 9. На мой взгляд это очень существенное обновление для ASP.NET 4.6. </span></p>
<p style="text-align: justify"><strong><span style="font-family: arial,helvetica,sans-serif">Добавлена поддержка .NET Compiler Platform (“Roslyn”) в ASP.NET.</span><span style="font-family: arial,helvetica,sans-serif"> </span></strong></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">По мне, ещё одно существенное улучшение. Чтобы не быть многословным, отмечу самое ванное преимущество, которое мы получаем, используя Roslyn это – скорость компиляции. Вдобавок ко всему и новые возможности языков программирования, хотя я их считаю пока ещё мало полезными. Для получения больших сведений на данный счёт можете взглянуть, например, <a href="https://blogs.msdn.com/b/webdev/archive/2014/05/12/enabling-the-net-compiler-platform-roslyn-in-asp-net-applications.aspx">сюда</a>. </span></p>
<p style="text-align: justify"><strong><span style="font-family: arial,helvetica,sans-serif">Прочие улучшения и обновления в ASP.NET 4.6.</span><span style="font-family: arial,helvetica,sans-serif"> </span></strong></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Далее перечислен список менее значимых, хотя вполне себе полезных улучшений и обновлений. Были обновлены MVC 5 и Web API 2 до версии 5.2.3, сделаны мелкие улучшения и исправления ошибок. Добавлена асинхронная модель привязки в Web Forms, были обновлены элементы управления для поддержки Entity Framework 6 и обновлена библиотека Ajax Control Toolkit. Полный перечень всего вышесказанного можно найти в <a href="https://blogs.msdn.com/b/webdev/archive/2015/04/30/updates-for-asp-net-4-6-web-forms-mvc-5-web-api-2.aspx">данной статье</a>.Также следует отметить ещё одно улучшение, не относящееся непосредственно к платформе ASP.NET 4.6, но используемое ею, это – новый 64-разрядный<span style="font-family: arial,helvetica,sans-serif"> JIT</span> компилятора. В .NET Framework 4.6 представлена новая версия компилятора JIT, который имеет значительно большую производительность, чем существующий 64-разрядный компилятор JIT. Из всего вышеперечисленного видно, что изменений и улучшений не мало, что делает платформу ASP.NET 4.6 вполне себе актуальной на сегодняшний день. И конечно, улучения будут и в будущем.</span></p>
<p style="text-align: justify"><strong><span style="font-family: arial,helvetica,sans-serif">А что насчёт новейшей версии – ASP.NET Core?</span><span style="font-family: arial,helvetica,sans-serif"> </span></strong></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Кратко перечислю основные значимые особенности, которые более детально будут описаны в последующих статьях. Намного более быстрая и легковесная среда выполнения. Возможность хостинга приложений где и как вам удобно, больше нет жёсткой привязки к IIS, хотя данная возможность появилась <a href="https://www.msdr.ru/57/">немного раньше</a>, но была не совсем удобной и доработанной, как уже отметил выше. Полная модульность благодаря ключевым изменениям и .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), а как известно облачные технологии уже сегодня имеют большую роль и будут иметь ещё большую в будущем. И наконец отмечу, что все перечисленные изменения появились благодаря тому, что платформа была переписана почти с нуля, благодаря уже имеющемуся опыту и сегодняшним требованиям, а это уже о многом говорит. </span></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Название моей прошлогодней статьи «<a href="https://www.msdr.ru/62/">Microsoft ASP.NET vNext: эволюция или революция?</a>» звучит слишком громко, но это вполне оправдано, если смотреть с точки зрения проделанной работы (которая на мой взгляд могла быть сделана и намного раньше), т.е. разницы с предыдущей. Да всё хорошо и замечательно, у нас много всего нового, но что нам, всем тем, кто использует данную платформу, даст новейшая технология? Ведь опыт показывает, что для построения «правильных» приложений технология уходит на второй план и в большинстве случаем не играет ключевую роль. То есть, если разработанное приложение не решает или решает плохо поставленные задачи, тогда никакая супер-мега технология, в подавляющем большинстве случаев, легко и просто не поможет кардинально исправить ситуацию. Если лет пять назад на так называемых «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. И так, будем прагматичны, имея две технологии для веб-разработки неизбежно возникнет вопрос: </span></p>
<p style="text-align: justify"><strong><span style="font-family: arial,helvetica,sans-serif">Что нам следует сделать, каков наш выбор? </span></strong></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Выбор в данном случае не простой. Если у вас классическое приложение ASP.NET Web Forms и много свободных ресурсов (денег) – мигрируйте на ASP.NET <span style="font-family: Arial">Core</span>. В случае ограниченных ресурсов, советую вам проделать постепенную миграцию до ASP.NET 4.6. Используя идею «Единый ASP.NET» это можно сделать поэтапно, где-то оставить старый код, где-то MVC, а в частях где производительность критична на клиенте и сервере тоже – подход с одностраничным приложением (SPA), например, используя AngularJS. Я со своими разработчиками делал подобное, есть опыт миграции корпоративных веб-порталов с ASP.NET 3.5 на ASP.NET 4.6. И скажу вам, что это не так просто, как вначале казалось, слишком много подводных камней (<a href="https://blogs.msdn.com/controlpanel/blogs/posteditor.aspx/(http:/blogs.msdn.com/b/yatajga/archive/2015/03/29/asp-net-3-5-asp-net-4-5.aspx)">вот один из многих</a>) было, отчасти зависящих также и от качества кода. Ну а если ваш код не удовлетворяет вашим потребностям, то тут стоит задуматься именно над этим, а не о технологии или платформе. В том случае, если у вас приложение ASP.NET MVC, переходить на ASP.NET <span style="font-family: Arial">Core</span> стоит в двух случаях: у вашего приложения проблемы с производительностью (вы сделали всё, дальше ничего оптимизировать невозможно) или у вас много <span style="text-decoration: line-through">денег</span> свободного времени. В противном случае нужно улучшать свой код. Бывают случаи, когда код сильно завязан на System.Web.dll и IIS, это тоже весомый повод ничего не трогать. Ну и последний случай, если ASP.NET используется исключительно в виде веб-сервисов, например, в случае с Web API. Примером тому могут быть одностраничные приложения (SPA) или распределённые, которые могут и не иметь отношения к HTML. В подобном случае перейти на новую версию будет намного легче, чем в предыдущих. Опять-таки, если вас всё устраивает, то переходить на ASP.NET <span style="font-family: Arial">Core</span> незачем. Почти во всех случаях, достаточно легко и быстро обновить .NET Framework до версии 4.6 и жить спокойно. Я знаю приложения и людей, которые используют всё ещё классический ASP и пока ещё их это устраивает. Если вы не довольны производительностью Web API и IIS, то это тоже повод для обновления на ASP.NET <span style="font-family: Arial">Core</span>. </span></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Теперь осталось попытаться дать однозначный ответ на главный вопрос, так каков же наш выбор<span style="font-family: Arial">:</span> ASP.NET 4.x или <span style="font-family: Arial">ASP.NET </span><span style="font-family: Arial">Core</span>? Однозначного ответа нет, зависит от... И выбор за вами, однако, нужно помнить, что будущее за <span style="font-family: Arial">ASP.NET </span><span style="font-family: Arial">Core</span> и рано или поздно оно наступит.</span></p>]]></content:encoded>
    </item>
    <item>
      <title>Платформа ASP.NET Core 1.0. Часть 1: введение, общее описание и будущее .NET Framework</title>
      <link>https://docs.microsoft.com/archive/blogs/yatajga/asp-net-core-1-0</link>
      <pubDate>Mon, 15 Aug 2016 16:50:00 GMT</pubDate>
      <dc:creator><![CDATA[Yatajga]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yatajga/2015/04/26/asp-net-5-1/</guid>
      <description><![CDATA[На вопрос: «Microsoft ASP.NET vNext: эволюция или революция?» был дан однозначный ответ – революция....]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">На вопрос: «Microsoft ASP.NET vNext: эволюция или революция?» <a target="_blank" href="https://www.msdr.ru/62/">был дан однозначный ответ</a> – революция. В данном цикле статей я постараюсь<span style="font-family: arial,helvetica,sans-serif"> максимально подробно</span> описать новейшую технологию для создания веб-приложений, а именно – ASP.NET vNext, которая в начале получила официальное название ASP.NET 5, а позднее была переименована в ASP.NET Core 1.0. Будет ещё один цикл, уже касающийся разработки реального приложения с примерами, посвящённый применению данной технологии на практике. Начну с описания истории развития ASP.NET. В далёком 1996 году компанией Microsoft была предложена технология – <em>Active Server Pages (ASP)</em> для создания Web-приложений. Принцип работы приложения ASP был примерно такой: веб-страница на сервере содержала серверные скрипты на VBScript или JScript и при запросе страницы происходил запуск и выполнение кода скриптов с последующей генерацией HTML. По сравнию с CGI это был большой шаг вперед. С выходом платформы Microsoft <span style="font-family: arial,helvetica,sans-serif">.NET Framework</span> в 2002 году вышла совершенно новая платформа для разработки веб-приложений ASP.NET, которая была обновлена в 2003 году до версии <span style="font-family: arial,helvetica,sans-serif">ASP.NET 1.1. Именно тогда началась история <span style="font-family: arial,helvetica,sans-serif"><span style="font-family: arial,helvetica,sans-serif">ASP.NET.</span></span> Это была совершенно новая, тогда ещё технология у которой было масса преимуществ перед ASP. По сути это был уже полноценный фреймворк для разработки веб-приложений. Время не стояло на месте, параллельно с развитием .NET Framework развивался и ASP.NET, в 2005 году было выпущено крупное обновление. Основными нововведениями были: темы, мастер-страницы, глобализация и т.п. Веб развивался быстрыми темпами, веб-страницы становились всё более интерактивными и насыщенными, появилась технология AJAX. В 2007 году было выпущено ещё одно крупное обновление – ASP.NET 3.5. Именно тогда появилась поддержка таких мощных средств как: <span style="font-family: arial,helvetica,sans-serif">ASP.NET AJAX, LINQ, Dynamic Data. С выпуском <span style="font-family: arial,helvetica,sans-serif">ASP.NET 3.5 SP1 в 2009 году был добавлен новый подход для обработки запросов веб-страниц на основе шаблона MVC. Теперь их стало целых два: Web Forms и MVC.</span></span></span><br style="font-family: arial,helvetica,sans-serif" /></span></p>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2016/08/A72I1.png" />
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif"><span style="font-family: arial,helvetica,sans-serif"><span style="font-family: arial,helvetica,sans-serif"><span style="font-family: arial,helvetica,sans-serif">Одновременно с запуском .NET Framework 4 была обновлена и ASP.NET до четвёртой версии. Ещё одно крупное обновление платформы было выпущено с выходом ASP.NET 4.5. Появились такие средства как Web API и SignalR. С <a target="_blank" href="https://www.msdr.ru/44/">выходом Visual Studio 2013</a> появилась новая концепция – «Единый ASP.NET». Были обновлены все компоненты платформы, а также появилась новая спецификация <a href="https://blogs.msdn.com/b/yatajga/archive/2014/12/23/microsoft-owin-asp-net-owin-microsoft-katana.aspx">OWIN – открытый интерфейс веб-сервера для .NET</a> (Open Web Server Interface for .NET), которая стала основой ASP.NET vNext. А уже в прошлом году была выпущена предварительная версия кардинально переработанной технологии для разработки веб-приложений от Microsoft, которая получила официальное название – ASP.NET 5. Помимо прочего, также доступно очень большое количество обновленных и новых технологий и продуктов от Microsoft, финальные версии которых выйдут уже в этом году. А теперь обо всём этом по порядку. Начну с самого крупного и значимого события – обновления и улучшения .NET Framework. Прежде чем начать, вспомним историю развития .NET Framework:</span></span></span></span></p>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2016/08/A72I2.png" />
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif"><span style="font-family: arial,helvetica,sans-serif"><span style="font-family: arial,helvetica,sans-serif"><span style="font-family: arial,helvetica,sans-serif"> Платформа .NET была представлена в 2002 году и очень быстро завоевала популярность, став одной из основных современных средств разработки программного обеспечения. Её основными преумуществами перед предшественницей – технологией COM, которую она заменила, являются гибкость, более простая и надёжная модель программирования. Платформа равивалась, выходили всё новые версиии, библиотеки и технологии, для удовлетворения всё новых потребностей бысто развивающегося мира информационных технологий. Ну и конечно, Microsoft не сидит сложа руки, для того, чтобы идти в ногу со временем, продолжает улучшать платформу .NET. Совсем недавно платформа, представленная в прошлом году, была обновлена до версии .NET Framework 4.6.2. И так,  какое же будущее ожидает .NET? А будущее действительно очень интересное и многообещающее.
</span></span></span></span></p>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2016/08/A72I3.png" />
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Как видно из рисунка показанного выше, есть по сути две версии .NET Framework. Первая является логическим продолжением существующей версии .NET 4.5.2, которая получила официальное название – .NET 4.6 (обновлённые версии: <span style="font-family: Arial">.NET Framework 4.6.1 – 4.6.2</span>). Вторая именуется теперь уже как .NET Core 1.0 (до этого известная как <span style="font-family: Arial">.NET Core </span>5) и является упрощённой версией обычного .NET <span style="font-family: arial,helvetica,sans-serif">Framework</span>. Если с первым всё предельно ясно и понятно, то в случае со вторым возникает много вопросов. Самый главный – зачем он нам? Для удовлетворения быстрорастущих потребностей современного цифрового мира, который развивается стремительными темпами. Если взглянуть на шкалу развития платформы .NET приведённую выше, то можно увидеть, что цикл выпуска новых версий платформы составляет примерно пару лет, а то и больше, что является очень большим сроком при нынешнем положении дел. Нужно как то исправить ситуацию,  решение – <span style="font-family: arial,helvetica,sans-serif">.NET Core 1.0. Последний должен удовлетворять современным требованиям разработки, для этого были установлены новые тентенции для продвижения и развития платформы: быстрый цикл разработки и участие сообщества. Для этих целей специально была создана независимая организация ­<a target="_blank" href="https://www.dotnetfoundation.org/">.NET Foundation</a>­, которая будет заниматься развитием экосистемы .NET. По <a target="_blank" href="https://www.dotnetfoundation.org/projects">данной ссылке</a> перечислены все текущие проекты, которые будут развиваться под руководством последней. То есть получается платформа .NET становится открытой. Полная модульность – вот одна из главнейших возможностей, которая мне нравится больше всех. Особенно это полезно для веб-приложений, позже напишу почему.</span>
</span></p>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2016/08/A72I5.png" />
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Следующий рисунок показывает общую модель приложения, которая будет использовать платформу .NET Core. Модульность .NET Core означает, что фреймворк будет поставляться по частям через NuGet, тогда можно будет вместе с приложением поставлять саму платформу, которая будет изолирована от остальных. Т.е. не будет одной общей версии .NET на всю машину.
</span></p>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2016/08/A72I6.png" />
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Больше сведений про .NET 2015 и .NET Core можно узнать на <a href="https://channel9.msdn.com/Events/dotnetConf/2015">Channel 9</a>. Также советую почитать <a target="_blank" href="https://habrahabr.ru/company/microsoft/blog/245901/">данную статью</a> на хабре и <a target="_blank" href="https://www.microsoftvirtualacademy.com/training-courses/the-development-of-modern-apps-in-c-sharp-rus">изучить курс</a> на сайте Microsoft Virtual Academy. А что нас ожидает в ближайшем будущем, каким будет .NET завтра?</span></p>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2016/08/A72I4.png" />
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Больше сведений относительно настоящего и будущего платформы можно узнать из докладов <a target="_blank" href="https://channel9.msdn.com/events/dotnetConf/2016/NET-Conf-Day-1-Keynote-Scott-Hunter">dotnetConf 2016</a>. Теперь, поговорим об ASP.NET Core, ниже показана изображение общей схемы платформы.</span></p>
<img alt="" src="https://msdnshared.blob.core.windows.net/media/2016/08/A72I7.png" />
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Как можно видеть из рисунка, ключевыми свойствами новой технологии являются полная модульность и кроссплатформенность. То есть используя фреймворк как часть пакета развёртывания, больше не будет проблем конфигурации среды хостинга для приложения. Каждое приложение будет иметь свою, независимую версию платформы. Почти вся платформа написана с нуля и на управляемом коде, старого кода тут нет. Весь исходный код новейшей версии веб-платформы <a target="_blank" href="https://github.com/aspnet">открыт и доступен</a> на GiHub. Технологии ASP.NET MVC и Web API объеденены в одну, а Web Forms больше не используется в версии ASP.NET Core. Новая версия ASP.NET в ОС Windows будет работать используя одну из двух версий .NET Framework: .NET 4.6 и .NET Core 1.0. На Linux и Mac OS X будет использоваться только .NET Core. Больше сведений по ASP.NET Core можно получить на <a target="_blank" href="https://channel9.msdn.com/Series/Whats-New-with-ASPNET-5">Channel 9 ­«What's ­New with ASP.NET 5»</a><a target="_blank" href="https://channel9.msdn.com/Series/Whats-New-with-ASPNET-5">­</a>, тот же <a target="_blank" href="https://www.microsoftvirtualacademy.com/training-courses/what-s-new-with-asp-net-5">курс доступен на сайте</a> Microsoft Virtual Academy (<span style="font-family: Arial">ASP.NET 5 была переименована в ASP.NET Core 1.0</span>).­­ Также советую посмотреть курс <a target="_blank" href="https://app.pluralsight.com/library/courses/aspdotnet-core-1-0-fundamentals/table-of-contents">«ASP.NET Core 1.0 Fundamentals»</a> от Pluralsight. Много очень интересного и полезного для себя я почерпнул из доклада «<a href="https://www.techdays.ru/videos/11181.html">ASP.NET vNext: What it means to you and what it means to Microsoft</a>», который я пересмотрел не раз. В следующей части будет рассморено всё то, что предлагает нам новейшая версия .NET Framework в плане веб-разработки.</span></p>]]></content:encoded>
    </item>
    <item>
      <title>Как подружить SignalR 2 и ASP.NET 5 в ожидании выхода SignalR 3?</title>
      <link>https://docs.microsoft.com/archive/blogs/yatajga/signalr-2-asp-net-5</link>
      <pubDate>Tue, 19 Jan 2016 08:53:00 GMT</pubDate>
      <dc:creator><![CDATA[Yatajga]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yatajga/2016/01/19/signalr-2-asp-net-5/</guid>
      <description><![CDATA[В последнее время мне часто напоминают, что проект в галерее MSDN не обновляется вот уже достаточно...]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">В последнее время мне часто напоминают, что <a href="https://code.msdn.microsoft.com/The-ASPNET-vNext-Real-Time-b1d27fe4">проект в галерее</a> MSDN не обновляется вот уже достаточно продолжительное время, причину такой затянувшейся паузы и о том, что будет дальше с обновлением я опишу в данной статье. Давайте посмотрим на график выпуска релизов ASP.NET 5 приведённый <a href="https://github.com/aspnet/Home/wiki/Roadmap#future-work">на официальном сайте</a> на GitHub. Для удобства привожу его ниже, взяв из 13-ой ревизии документа на момент написания статьи, также добавлена дата релиза ASP.NET Beta5. </span></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Релиз – Дата: Beta5 – 30.06.2015 =&gt; Beta6 – 27.07.2015 =&gt; Beta7 – 02.09.2015 </span></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Релиз – Дата: Beta8 – 15.10.2015 =&gt; RC1 – 18.11.2015 =&gt; RC2 – 02.2016 =&gt; RTM – первый квартал 2016</span></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Из вышеприведённого графика видно, что релизы выходили достаточно часто ну и критических обновлений тоже было много. Последняя версия SignalR 3 – Beta5 уже не работает с версией ASP.NET 5 Beta7, не говоря уже о текущей RC1. И наконец в конце официального расписания релизов сказано, что поддержка Visual Basic, SignalR 3, Web Pages 4 в ASP.NET 5 появится после выхода RTM, где-то в третьем квартале 2016. Отсюда уже ясно, что, обновив пример из галереи до ASP.NET 5 RC 1, он перестанет работать. Так ка же быть? Временно использовать SignalR 2. Приложение «Real-Time Data Editing» в последний раз было обновлено используя Visual Studio 2015 RTM и ASP.NET Beta5. Я сделал так, чтобы в решении Visual Studio сохранялись предыдущие версии приложения:</span></p>
<img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A76/4807.A76I1.png" alt="" />
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">их можно скачивать и запускать также (детальное описание о том, как это сделать приведено <a href="https://code.msdn.microsoft.com/The-ASPNET-vNext-Real-Time-b1d27fe4" target="_blank">на странице приложения</a>). Для начала скачаем и обновим приложение из архива <strong>RealTimeDataEditorVS2015RTM-ASP5BETA5</strong>. Процесс обновления не буду приводить дабы не загромождать статью, да и сложного в этом ничего нет. После обновления имеем следующее:</span></p>
<img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A76/7268.A76I2.png" alt="" />
<p style="text-align: justify">приложение компилируется и запускается, но не показывает данные, так как нет SignalR 3. А что если подключить текущую dev-ветку кода SignalR 3 в проект? Приложение скомпилируется без ошибок, но вот работать не будет, как показано ниже.</p>
<img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A76/5482.A76I3.png" alt="" />

Ну что же, в будущем исправят, ну а пока продолжим установку SignalR 2 в проект. Нужно добавить в проект перечисленные ниже сборки:

<strong>"Microsoft.AspNet.Owin": "1.0.0-rc1-final"</strong>
<strong>"Microsoft.AspNet.SignalR.Core": "2.2.0"</strong>
<strong>"Microsoft.AspNet.SignalR.Owin": "1.2.2"</strong>
Также нужно учесть, что последние две сборки не совместимы с .NET Core и придётся использовать полноценный .NET Framework.

<img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A76/2072.A76I4.png" alt="" />
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Далее нужно освежить знания о конвейере ASP.NET и <a href="https://blogs.msdn.com/b/yatajga/archive/2014/12/26/microsoft-owin-asp-net-owin-iis-asp-net.aspx">вспомнить про модули</a> OWIN. В добавок нужно изучить все те изменения, которые <a href="https://blogs.msdn.com/b/webdev/archive/2014/11/14/katana-asp-net-5-and-bridging-the-gap.aspx">были сделаны при реализации</a> OWIN в ASP.NET 5. На основе этих знаний получаем один единственный тип:</span></p>
<!-- HTML generated using hilite.me -->
<div style="background: #ffffff;overflow: auto;width: auto;padding: .2em .6em">
<pre style="margin: 0;line-height: 125%;font-size: 12px"><span style="color: #0000ff">namespace</span> RealTimeDataEditor
{
    <span style="color: #0000ff">using</span> AppFunc = Func&lt;IDictionary&lt;<span style="color: #2b91af">string</span>, <span style="color: #2b91af">object</span>&gt;, Task&gt;;

    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">class</span> <span style="color: #2b91af">BuilderExtensions</span>
    {
        <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> IApplicationBuilder UseAppBuilder(
            <span style="color: #0000ff">this</span> IApplicationBuilder app, 
            Action&lt;IAppBuilder&gt; configure)
        {
            app.UseOwin(addToPipeline =&gt;
            {
                addToPipeline(next =&gt;
                {
                    <span style="color: #2b91af">var</span> appBuilder = <span style="color: #0000ff">new</span> AppBuilder();
                    appBuilder.Properties[<span style="color: #a31515">"builder.DefaultApp"</span>] = next;

                    configure(appBuilder);

                    <span style="color: #0000ff">return</span> appBuilder.Build&lt;AppFunc&gt;();
                });
            });

            <span style="color: #0000ff">return</span> app;
        }

        <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> UseSignalR2(<span style="color: #0000ff">this</span> IApplicationBuilder app)
        {
            app.UseAppBuilder(appBuilder =&gt; appBuilder.MapSignalR());
        }
    }
}
</pre>
</div>
&nbsp;
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Используем старый модуль SignalR 2 в новой версии,</span></p>
<!-- HTML generated using hilite.me -->
<div style="background: #ffffff;overflow: auto;width: auto;padding: .2em .6em;font-size: 12px">
<pre style="margin: 0;line-height: 125%"><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Configure(IApplicationBuilder app, IHostingEnvironment env,
    ILoggerFactory loggerFactory)
{
    app.UseStaticFiles();
    app.UseSignalR2();

    app.UseMvc(routes =&gt;
    {
        routes.MapRoute(
            name: <span style="color: #a31515">"default"</span>,
            template: <span style="color: #a31515">"{controller=Home}/{action=Index}/{id?}"</span>);
    });
} 
</pre>
</div>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">и видим, что всё работает нормально.</span></p>
<img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A76/7870.A76I5.png" alt="" />

<span style="font-family: arial,helvetica,sans-serif">Всё хорошо, но вот только в данном случае SignalR 2 не будет использовать веб-сокеты, они не доступны.</span>]]></content:encoded>
    </item>
    <item>
      <title>HTTP Platform Handler или как подружить ASP.NET 5 с IIS</title>
      <link>https://docs.microsoft.com/archive/blogs/yatajga/asp-net-5-3-http-platform-handler-1076</link>
      <pubDate>Sat, 19 Dec 2015 05:11:00 GMT</pubDate>
      <dc:creator><![CDATA[Yatajga]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yatajga/2015/12/19/asp-net-5-3-http-platform-handler-1076/</guid>
      <description><![CDATA[Вначале текущего года была представлена HTTP Platform Handler, основной целью которого была...]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Вначале текущего года была представлена HTTP Platform Handler, основной целью которого была возможность хостинга веб-приложений в Microsoft Azure c использованием IIS, но без использования платформы .NET Framework. К таковым, например, относятся: Java, Node.JS, Ruby on Rails и т.п. Таким образом получается, что HttpPlatformHandler предназначена главным образом для Microsoft Azure. Формально HttpPlatformHandler – это HTTP-модуль для версий IIS 8 и выше, то есть IIS 8+. Напомню, что на данный момент их всего три: IIS8, IIS 8.5 и IIS 10. И они по сути, почти ничем друг от друга не отличаются (поддержка HTTP/2 в IIS 10 не в счет) и присутствуют в следующих версиях операционных систем: Windows 8/ Windows Server 2012, Windows 8.1/Windows Server 2012 R2 и Windows 10 соответственно. Давайте на примере свежеустановленной версии Windows 10 Version 1511 в виртуальной среде Hyper-V попробуем более детально на практике рассмотреть HttpPlatformHandler.</span></p>
<p style="text-align: justify"><img alt="" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A75/7450.A75I1.png" /></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Запускаем веб-браузер на виртуальной машине и скачиваем установочный пакет HttpPlatformHandler v1.2 для x64.</span></p>
<p style="text-align: justify"><img alt="" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A75/8726.A75I2.png" /></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Прежде чем произвести установку посмотрим список установленных по умолчанию модулей при помощи диспетчера IIS (IIS Manager).</span></p>
<p style="text-align: justify"><img alt="" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A75/7674.A75I3.png" /></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">После окончания установки HTTP Platform Handler</span></p>
<p style="text-align: justify"><img alt="" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A75/8037.A75I4.png" /></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">смотрим на список модулей IIS ещё раз.</span></p>
<p style="text-align: justify"><img alt="" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A75/5670.A75I5.png" /></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Видно, что раздел неуправляемых HTTP-модулей IIS пополнился ещё одним модулем под названием httpPlatformHandler. Открываем Visual Studio 2015 и создаем приложение ASP.NET 5 (на момент написания статьи используется Visual Studio 2015 Update 1 с ASP.NET 5 RC1).</span></p>
<p style="text-align: justify"><img alt="" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A75/1122.A75I6.png" /></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Публикуем приложение в файловой системе.</span></p>
<p style="text-align: justify"><img alt="" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A75/2134.A75I7.png" /></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Каталоги approot и wwwroot, которые создаются при публикации приложения ASP.NET 5, копируем в стандартную директорию IIS. В данном случае каталог wwwroot заменяет собой присутствующий по умолчанию каталог wwwroot в inetpub. Напомню, что wwwroot содержит только статические файлы приложения (файлы JavaScript тоже таковыми являются), всё остальное находится в папке approot.</span></p>
<p style="text-align: justify"><img alt="" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A75/4606.A75I8.png" /></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">После копирования, или перед, нам нужно поменять настройки пула приложения, в данном случае он сам непосредственно не будет загружать никакую версию CLR, то есть будет по сути обычным процессом. Это возможно благодаря тому, что, приложения ASP.NET 5 имеют собственный процесс, в котором выполняются. До ASP.NET 4.6, как вы знаете в качестве хоста приложения выступали непосредственно процессы пулов IIS. В конце мы посмотрим на список процессов.</span></p>
<p style="text-align: justify"><img alt="" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A75/0184.A75I9.png" /></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Нужно также убедиться, что секция обработчиков HTTP-данных разблокирована в настройках IIS, по умолчанию это так и есть.</span></p>
<p style="text-align: justify"><img alt="" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A75/3010.A75I10.png" /></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Вот так это будет выглядеть: Lock Section (секция разблокирована, активна кнопка блокировки).</span></p>
<p style="text-align: justify"><img alt="" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A75/7041.A75I11.png" /></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Ну и после вышеописанного останется только запустить приложение и убедиться, что всё работает.</span></p>
<p style="text-align: justify"><img alt="" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A75/4604.A75I12.png" /></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Получается, что в настоящее время всё же, кое-что нужно выполнять вручную, но как видно всё просто. Теперь давайте запустим Process Explorer и посмотрим на список процессов<span style="font-family: arial,helvetica,sans-serif">, созданных для работы приложения</span>, про которые я упомянул выше. Действительно, если посмотреть на выделенное дерево процессов, то можно увидеть, что у процесса пула w3wp.exe нет вкладок с информацией о .NET, так как CLR не загружена. Ну а в качестве нового хоста для приложения ASP.NET 5 выступает DNX.</span></p>
<p style="text-align: justify"><img alt="" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A75/2148.A75I13.png" /></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Назревает вполне себе логичный вопрос: если всю работу, ну или почти всю на себя берёт DNХ, то зачем нам вообще процесс пула и сам IIS? Тут нужно вспомнить, что IIS <a target="_blank" href="https://blogs.msdn.com/b/yatajga/archive/2014/12/23/microsoft-owin-asp-net-iis-asp-net-owin.aspx">это не только процесс пула</a> W3WP, как многим кажется на первый взгляд, а целый комплекс компонент, взаимодействующих между собой, как показано в статье по ссылке. И в данном конкретном случае, часть работы по обработке запросов (прием и передача, хостинг файлов, управление и мониторинг процессов и т.п.) IIS берет на себя. Ну и наконец ниже приведен список ссылок по HTTP Platform Handler, их не много, да и информации тоже:</span></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif"><a target="_blank" href="https://www.iis.net/learn/extensions/httpplatformhandler">https://www.iis.net/learn/extensions/httpplatformhandler</a></span>
<span style="font-family: arial,helvetica,sans-serif"><a target="_blank" href="https://www.hanselman.com/blog/AnnouncingRunningRubyOnRailsOnIIS8OrAnythingElseReallyWithTheNewHttpPlatformHandler.aspx">https://www.hanselman.com/blog/AnnouncingRunningRubyOnRailsOnIIS8OrAnythingElseReallyWithTheNewHttpPlatformHandler.aspx</a></span>
<span style="font-family: arial,helvetica,sans-serif"><a target="_blank" href="https://azure.microsoft.com/en-us/blog/announcing-the-release-of-the-httpplatformhandler-module-for-iis-8">https://azure.microsoft.com/en-us/blog/announcing-the-release-of-the-httpplatformhandler-module-for-iis-8</a></span></p>]]></content:encoded>
    </item>
    <item>
      <title>The application "ASP.NET Core 1.0 (vNext) Real-Time Data Editing" was updated for using Visual Studio 2015 RC</title>
      <link>https://docs.microsoft.com/archive/blogs/yatajga/the-application-asp-net-5-vnext-real-time-data-editing-was-updated-for-using-visual-studio-2015-rc</link>
      <pubDate>Sat, 06 Jun 2015 07:41:00 GMT</pubDate>
      <dc:creator><![CDATA[Yatajga]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yatajga/2015/06/06/the-application-asp-net-5-vnext-real-time-data-editing-was-updated-for-using-visual-studio-2015-rc/</guid>
      <description><![CDATA[Today I had time to upgrade the mentioned application and I don't know why MSDN Code Gallery doesn't...]]></description>
      <content:encoded><![CDATA[Today I had time to upgrade the mentioned application and I don't know why <a href="https://code.msdn.microsoft.com/" target="_blank">MSDN Code Gallery</a> doesn't support projects and solutions for ASP.NET Core template. I still use hack for deploying that kind of projects in code gallery. There are special requirements and instructions for building this code sample (you can <a href="https://code.msdn.microsoft.com/The-ASPNET-vNext-Real-Time-b1d27fe4" target="_blank">take it from the gallery</a>) by using the steps described bellow.

<strong>1. Download source code from the link mentioned above.</strong>

<strong>2. Find the RealTimeDataEditor file in the following folder (there are four files, for VS 14 CTP 3, VS 14 CTP 4, VS 2015 Preview and Visual Studio 2015 RC).</strong>

<img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A73/5557.A73I1.png" alt="" />

<strong>3. Rename it to RealTimeDataEditor*(file name).zip and extract.</strong>

<img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A73/2210.A73I2.png" alt="" />

<strong>4. You can see the folder which contains files of Visual Studio 2015 an ASP.NET 5.</strong>

<img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A73/6685.A73I3.png" alt="" />

<strong>5. Open project by using Visual Studio 2015 RC and run it.</strong>

<img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A73/7610.A73I4.png" alt="" />

That's all, you can run and investigate the new type of project. Good luck!]]></content:encoded>
    </item>
    <item>
      <title>Обновление приложения ASP.NET 3.5 до ASP.NET 4.5 и сопутствующие проблемы: общая система аутентификации с использованием форм.</title>
      <link>https://docs.microsoft.com/archive/blogs/yatajga/asp-net-3-5-asp-net-4-5-10</link>
      <pubDate>Sun, 29 Mar 2015 07:15:00 GMT</pubDate>
      <dc:creator><![CDATA[Yatajga]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yatajga/2015/03/29/asp-net-3-5-asp-net-4-5-10/</guid>
      <description><![CDATA[Мне часто приходится заниматься проблемами миграции старых приложений ASP.NET на более новые версии....]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify;"><span style="font-family: arial,helvetica,sans-serif;">Мне часто приходится заниматься проблемами миграции старых приложений ASP.NET на более новые версии. И независимо от того насколько много документации по этому поводу предоставляет Microsoft и насколько богатый опыт накопился у сообщества за последнее время, невозможно избежать новых проблем на которые тратится много человеко-часов. Даже несмотря на то, что статьи в MSDN описывают проблемы миграции в розовом цвете, реальность всё же сильно другая. Именно решению подобных проблем будет посвящён данный цикл статей, точнее весь мой опыт который накопился за всё это время. В данной статье будет рассмотрен случай переноса веб-приложения ASP.NET 3.5 на платформу ASP.NET 4.5.1 и проблема разделения куки-файла аутентификации (стандартно это .ASPXAUTH cookie) между разными приложениями. Как известно, ASP.NET <a href="https://msdn.microsoft.com/ru-ru/library/eb0zx8fc%28v=vs.100%29.aspx" target="_blank">поддерживает проверку подлинности с помощью форм в распределенной среде</a>: либо между приложениями на одном сервере, либо на веб-ферме. И данная возможность часто используется в крупных веб-приложениях. Проблема в общих чертах вглядит так, у нас есть несколько веб-приложений&nbsp;<span style="font-family: arial,helvetica,sans-serif;">ASP.NET 3.5 работающих в веб-ферме, назовём их </span> <strong>A</strong>,<strong> B</strong>, <strong>С</strong>,<strong> D</strong>,<strong> E</strong><strong>. </strong>Для всех из них используется единый механизм аутентификации и авторизации на основе форм. Приложение <strong>A</strong> основное, у остальных отсуствует собственная логика системы авторизации и аутентификации, они разделяют её с <strong>A</strong>. Нам нужно перенести <span style="font-family: arial,helvetica,sans-serif;"><strong>A</strong>,<strong> B</strong>, <strong>С</strong>,<strong> D</strong></span> с <span style="font-family: arial,helvetica,sans-serif;">ASP.NET 3.5 на <span style="font-family: arial,helvetica,sans-serif;">ASP.NET 4.5.1, <strong>E</strong> оставляем. Начинать можно с <a href="https://msdn.microsoft.com/ru-ru/library/dd483478%28v=vs.100%29.aspx" target="_blank">данного руководства</a>, на пути будет много препятствий (сильно специфичных для проекта, но данная статья только об одном), которые нужно будет преодолеть с помощью могучего интернета (полезными также будут<span style="font-family: arial,helvetica,sans-serif;"><span style="font-family: arial,helvetica,sans-serif;"><span style="font-family: arial,helvetica,sans-serif;"> <a href="https://www.asp.net/whitepapers/aspnet4/breaking-changes#0.1__Toc256770148" target="_blank">вот эта документ</a></span></span></span> и <a href="https://msdn.microsoft.com/ru-ru/library/vstudio/ee941656%28v=vs.100%29.aspx#aspnet" target="_blank">это руководство</a>). Допустим всё проходит гладко, ну или почти всё. Открываем наш сайт <span style="font-family: arial,helvetica,sans-serif;"><strong>A</strong>, логинимся, переходим на сайт <strong>B</strong>, нас туда не пускают. Самое главное, всё отлино работает на старой платформе. Пытаемя выяснить причины.&nbsp; Первым делом проверяем идентичность настроек секций <em>&lt;authentication&gt;</em> и <em>&lt;machineKey&gt;</em>.</span></span></span></span></p>
<pre class="xml" style="font-size: 12px; font-family: monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;authentication</span> <span style="color: #000066;">mode</span>=<span style="color: #ff0000;">"Forms"</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;forms</span> <span style="color: #000066;">path</span>=<span style="color: #ff0000;">"/"</span> <span style="color: #000066;">loginUrl</span>=<span style="color: #ff0000;">"~/Default.aspx"</span> <span style="color: #000066;">protection</span>=<span style="color: #ff0000;">"All"</span></span>
<span style="color: #009900;"> <span style="color: #000066;">domain</span>=<span style="color: #ff0000;">".mydomain.com"</span> <span style="color: #000066;">timeout</span>=<span style="color: #ff0000;">"2000"</span></span>
<span style="color: #009900;"> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">".ASPXAUTH"</span></span>
<span style="color: #009900;"> <span style="color: #000066;">slidingExpiration</span>=<span style="color: #ff0000;">"true"</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/forms<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/authentication<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;machineKey</span> </span>
<span style="color: #009900;"> <span style="color: #000066;">validationKey</span>=<span style="color: #ff0000;">"A2734932DA6EE8B5917A35C2BA8536DE3E14074C415EE45417CD7"</span></span>
<span style="color: #009900;"> <span style="color: #000066;">decryptionKey</span>=<span style="color: #ff0000;">"4171F954D13C3C2DDF7C3551283C4"</span></span>
<span style="color: #009900;"> <span style="color: #000066;">validation</span>=<span style="color: #ff0000;">"SHA1"</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/machineKey<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;</pre>
<p style="text-align: justify;"><span style="font-family: arial,helvetica,sans-serif;">Обратите внимание, что в примере, для экономии места, приведены фиктивные значения <em>validationKey</em> и d<em>ecryptionKey</em>, реальные же намного длинее. Убедившись что всё идентично, запускаем приложения, не работает аутентификации. Разница платформ, однозначно да. Смотрим логи сервера, находим: <span style="text-decoration: underline;"><em>Event code: 4005 Event message: Forms authentication failed for the request. Reason: The ticket supplied was invalid.</em></span> <span style="font-family: arial,helvetica,sans-serif;">Нужно проверить настройки IIS, не была ли включена генерация случайных ключей на уровне IIS, также нужно проверить аккаунты от имени которых работают пулы, на идентичность. Была и такая проблема с приложениями <strong>C</strong> и <strong>D</strong>, решение <a href="https://blogs.msdn.com/b/tess/archive/2009/09/16/forms-authentication-fails-after-installing-iis-7-5.aspx">описано здесь</a></span>. Те кто регулярно наблюдал и наблюдает за изменениями в платформе .NET наверняка помнят, что в .NET 4.5 <a href="https://blogs.msdn.com/b/webdev/archive/2012/10/22/cryptographic-improvements-in-asp-net-4-5-pt-1.aspx" target="_blank">были внесены криптографические улучшения</a> остальным пришлось бы потрать больше времени в поисках. Прочитав все три части становится понятно, откуда может быть проблема, дело в арибуте <em>targetFramework</em> узла <strong>&lt;httpRuntime targetFramework="4.5.1" /&gt;</strong>. Он попросту отсутствует в старых версиях web.config, хотя присутствует по умолчанию в новых. Как и почему, всё описано <a href="https://blogs.msdn.com/b/webdev/archive/2012/10/23/cryptographic-improvements-in-asp-net-4-5-pt-2.aspx" target="_blank">здесь</a>. А что касается приложения <strong>E</strong>, его по тем или иным причинам невозможно перенести на новую платформу. В этом случае возникает другая проблема, проблема разных механизмов шифрования, котрая решается добавлением атрибута <em>compatibilityMode </em>в тег <strong>&lt;machineKey compatibilityMode="Framework20SP1" /&gt;</strong>. Также была проблема и с <em>requestValidationMode</em>, решается удалением этого атрибута из<strong> &lt;httpRuntime requestValidationMode="2.0" /&gt;</strong>. Значения атрибутов и элементов конфигураций не были описаны детально, более подробное описание можно найти в MSDN или по приведённым ссылкам. В итоге получаем, что общие решения не всегда работают, каждое приложени в своём роде уникально. Надеюсь, что данная статья окажется полезной, если вы сталкнётесь с подобным.<br /></span></p>]]></content:encoded>
    </item>
    <item>
      <title>Улучшенные возможности отладки и профилирования приложений в Visual Studio 2015: оценка времени выполнения кода с помощью Debugger PerfTips</title>
      <link>https://docs.microsoft.com/archive/blogs/yatajga/113</link>
      <pubDate>Sat, 31 Jan 2015 05:19:00 GMT</pubDate>
      <dc:creator><![CDATA[Yatajga]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yatajga/2015/01/31/113/</guid>
      <description><![CDATA[В новейшей версии IDE от Microsoft появилось множество новых возможностей для отладки и...]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify;"><span style="font-family: arial,helvetica,sans-serif;">В новейшей версии IDE от Microsoft появилось множество новых возможностей для отладки и профилирования приложений, которые делают процесс отладки приложений ещё более приятным и удобным. В нескольких статьях я постараюсь коротко описать каждое нововведение. Начну с описания возможности измерения времени выполнения кода во время отладки.&nbsp; Как мы обычно измеряем время выполнения метода в управляемом коде? Примерно так:</span></p>
<pre class="csharp" style="font-size: 12px; font-family: monospace;"><span style="color: #0600ff; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> ProductsRepository <span style="color: #008000;">:</span> IProductsRepository
<span style="color: #008000;">{</span>
    <span style="color: #0600ff; font-weight: bold;">private</span> <span style="color: #0600ff; font-weight: bold;">readonly</span> Stopwatch stopwatch<span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #0600ff; font-weight: bold;">public</span> ProductsRepository<span style="color: #008000;">(</span><span style="color: #008000;">)</span>
    <span style="color: #008000;">{</span>
        <span style="color: #0600ff; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000ff;">stopwatch</span> <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Stopwatch<span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">}</span>
&nbsp;
    <span style="color: #008080;">#region IProductsRepository Members</span>
&nbsp;
    <span style="color: #0600ff; font-weight: bold;">public</span> IList<span style="color: #008000;">&lt;</span>Product<span style="color: #008000;">&gt;</span> GetAllProducts<span style="color: #008000;">(</span><span style="color: #008000;">)</span>
    <span style="color: #008000;">{</span>
        <span style="color: #0600ff; font-weight: bold;">try</span>
        <span style="color: #008000;">{</span>
            <span style="color: #0600ff; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000ff;">stopwatch</span><span style="color: #008000;">.</span><span style="color: #0000ff;">Start</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
            <span style="color: #0600ff; font-weight: bold;">return</span> ProductsDataStore<span style="color: #008000;">.</span><span style="color: #0000ff;">Products</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">}</span>
        <span style="color: #0600ff; font-weight: bold;">finally</span>
        <span style="color: #008000;">{</span>
            <span style="color: #0600ff; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000ff;">stopwatch</span><span style="color: #008000;">.</span><span style="color: #0000ff;">Stop</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
            Trace<span style="color: #008000;">.</span><span style="color: #0000ff;">WriteLine</span><span style="color: #008000;">(</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">.</span><span style="color: #0000ff;">Format</span><span style="color: #008000;">(</span>
                <span style="color: #666666;">"ProductsRepository.GetAllProducts execution time: {0} ms."</span>,
                <span style="color: #0600ff; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000ff;">stopwatch</span><span style="color: #008000;">.</span><span style="color: #0000ff;">ElapsedMilliseconds</span><span style="color: #008000;">)</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
            <span style="color: #0600ff; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000ff;">stopwatch</span><span style="color: #008000;">.</span><span style="color: #0000ff;">Reset</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">}</span>   
    <span style="color: #008000;">}</span>
&nbsp;
    <span style="color: #0600ff; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> Insert<span style="color: #008000;">(</span>Product product<span style="color: #008000;">)</span>
    <span style="color: #008000;">{</span>
        ProductsDataStore<span style="color: #008000;">.</span><span style="color: #0000ff;">Insert</span><span style="color: #008000;">(</span>product<span style="color: #008000;">)</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">}</span>
&nbsp;
    <span style="color: #0600ff; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> Update<span style="color: #008000;">(</span>Product product<span style="color: #008000;">)</span>
    <span style="color: #008000;">{</span>
        ProductsDataStore<span style="color: #008000;">.</span><span style="color: #0000ff;">Update</span><span style="color: #008000;">(</span>product<span style="color: #008000;">)</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">}</span>
&nbsp;
    <span style="color: #0600ff; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> Delete<span style="color: #008000;">(</span><span style="color: #6666cc; font-weight: bold;">int</span> productId<span style="color: #008000;">)</span>
    <span style="color: #008000;">{</span>
        ProductsDataStore<span style="color: #008000;">.</span><span style="color: #0000ff;">Delete</span><span style="color: #008000;">(</span>productId<span style="color: #008000;">)</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">}</span>
&nbsp;
    <span style="color: #008080;">#endregion</span>
<span style="color: #008000;">}</span>
&nbsp;</pre>
<p style="text-align: justify;"><span style="font-family: arial,helvetica,sans-serif;">Результат будет таким, как показано ниже:</span><span style="font-family: arial,helvetica,sans-serif;"><br /></span></p>
<p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A70/7762.A70I1.png" original-url="https://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-67-89-A70/7762.A70I1.png" alt="" /></p>
<p style="text-align: justify;"><span style="font-family: arial,helvetica,sans-serif;">В Visual Studio 2015 появилась новая особенность, которая называется "PerfTips". Своего рода подсказки показывающие производительность, то есть время выполнения кода во время отладки:</span></p>
<p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A70/1732.A70I2.png" original-url="https://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-67-89-A70/1732.A70I2.png" alt="" /></p>
<p style="text-align: justify;"><span style="font-family: arial,helvetica,sans-serif;">Что нужно сделать, чтобы увидеть время выполнения кода? Почти ничего, достаточно пройтись по строке кода во время отладки (Step Over (F10)) и подсказка будет выводиться автоматически. Не придётся больше писать рутинный код. Конечно, никто не говорит отказываться от Stopwatch, так как данная особенность работает в отладчике, а если нужно получить трассировку выполнения разных участков кода без отлаки и отладчика, то тут без Stopwatch не обойтись. Больше сведений о&nbsp;PerfTips можно получить <a href="https://blogs.msdn.com/b/visualstudioalm/archive/2014/08/18/perftips-performance-information-at-a-glance-while-debugging-with-visual-studio.aspx" target="_blank">отсюда</a>.</span></p>]]></content:encoded>
    </item>
    <item>
      <title>Выпущена ASP.NET 5 Beta2</title>
      <link>https://docs.microsoft.com/archive/blogs/yatajga/asp-net-5-beta2</link>
      <pubDate>Sun, 18 Jan 2015 01:02:00 GMT</pubDate>
      <dc:creator><![CDATA[Yatajga]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yatajga/2015/01/18/asp-net-5-beta2/</guid>
      <description><![CDATA[Два дня назад были выпущены обновлённые версии Visual Studio 2015 и ASP.NET 5. Первая получила...]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify;"><span style="font-family: arial,helvetica,sans-serif;">Два дня назад были выпущены обновлённые версии Visual Studio 2015 и ASP.NET 5. Первая получила версию CTP 5, а вторая &ndash; Beta2. Далее перечислены улучшения и исправления в новом обновлении для ASP.NET. Появилась возможность добавления ссылок на проекты отличные от типов проектов ASP.NET 5.<br /></span></p>
<p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A69/8400.A69I1.png" original-url="https://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-67-89-A69/8400.A69I1.png" alt="" /></p>
<p style="text-align: justify;"><span style="font-family: arial,helvetica,sans-serif;">Примером такого проекта служит обычная библиотека классов.</span></p>
<p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A69/4314.A69I2.png" original-url="https://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-67-89-A69/4314.A69I2.png" alt="" /></p>
<p style="text-align: justify;"><span style="font-family: arial,helvetica,sans-serif;">Напомню, что в предыдущих предварительных версиях ASP.NET 5 подобного не было. Также появилась возможность запуска приложений в режиме отладки в различных браузерах, в том числе и на браузерах эмуляторов. </span></p>
<p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A69/6708.A69I3.png" original-url="https://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-67-89-A69/6708.A69I3.png" alt="" /></p>
<p style="text-align: justify;"><span style="font-family: arial,helvetica,sans-serif;">Вот только тут отмечу, что использовать возможность на виртуалках Azure нет возможности, так как там недоступна технология Hyper-V. Была также добалена возможность использования собственных команд в файле <strong>project.json</strong>, а также возможность запуска и отладки последних.</span></p>
<p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A69/6835.A69I4.png" original-url="https://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-67-89-A69/6835.A69I4.png" alt="" /></p>
<p style="text-align: justify;"><span style="font-family: arial,helvetica,sans-serif;">Больше сведений касательно изменений в версии Beta2 <a href="https://github.com/aspnet/Home/releases/tag/v1.0.0-beta2" target="_blank">можно получить отсюда</a>. Более детально новые возможности Visual Studio 2015 и ASP.NET будут описаны в будущем. Чтобы опробовать новые возможности продукта можно использовать готовые образы в Microsoft Azure</span></p>
<p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A69/8053.A69I5.png" original-url="https://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-67-89-A69/8053.A69I5.png" alt="" /></p>
<p>или скачать <a href="https://www.visualstudio.com/en-us/news/vs2015-vs">отсюда</a> и установить на локальной машине.</p>]]></content:encoded>
    </item>
    <item>
      <title>Особенности использования Unity Application Block для внедрения зависимостей в приложении ASP.NET MVC 5</title>
      <link>https://docs.microsoft.com/archive/blogs/yatajga/unity-application-block-1076</link>
      <pubDate>Tue, 30 Dec 2014 22:34:00 GMT</pubDate>
      <dc:creator><![CDATA[Yatajga]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yatajga/2014/12/30/unity-application-block-1076/</guid>
      <description><![CDATA[Как известно в ASP.NET MVC 3 и выше есть два основных варианта реализации механизма внедрения...]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify;"><span style="font-family: arial,helvetica,sans-serif;">Как известно в ASP.NET MVC 3 и выше есть два основных варианта реализации механизма внедрения зависимостей. Первый &ndash; использовать собственную фабрику контроллеров, второй &ndash; использовать так называемый <em>Dependency resolver</em>. Последний есть не что иное, как обычный <strong>Service Locator</strong> (Марк Симан в своей книге <a href="https://sergeyteplyakov.blogspot.com/2013/02/dependency-injection-in-net.html">"Dependency Injection in .NET"</a> называет его антипаттерном) для предоставления нужного DI-контейнера. Что же, поробуем использовать Uity в приложении MVC 5. Для этого создаём простое приложение</span> <br /> <br /> <img style="width: 100%;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A68/8015.A68I1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-67-89-A68/8015.A68I1.png" alt="" /> <br /> <br /> <span style="font-family: arial,helvetica,sans-serif;">без использования лишних библиотек, не нужных нам в данный момент.</span> <br /> <br /> <img style="width: 100%;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A68/7573.A68I2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-67-89-A68/7573.A68I2.png" alt="" /> <br /> <br /> <span style="font-family: arial,helvetica,sans-serif;">Устанавливаем Unity Application Block последней версии через менеджер NuGet.</span> <br /> <br /> <img style="width: 100%;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A68/2311.A68I3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-67-89-A68/2311.A68I3.png" alt="" /> <br /> <br /> <span style="font-family: arial,helvetica,sans-serif;">Напишем самую простую реализацию Dependency resolver, как обычно пишется в книгах.</span></p>
<pre class="csharp" style="font-size: 12px; font-family: monospace;"><span style="color: #0600ff; font-weight: bold;">namespace</span> UnityDIExample
<span style="color: #008000;">{</span>
    <span style="color: #0600ff; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> UnityDependencyResolver <span style="color: #008000;">:</span> IDependencyResolver
    <span style="color: #008000;">{</span>
        <span style="color: #0600ff; font-weight: bold;">private</span> <span style="color: #0600ff; font-weight: bold;">readonly</span> IUnityContainer unityContainer<span style="color: #008000;">;</span>
 
        <span style="color: #0600ff; font-weight: bold;">public</span> UnityDependencyResolver<span style="color: #008000;">(</span><span style="color: #008000;">)</span>
        <span style="color: #008000;">{</span>
            unityContainer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> UnityContainer<span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
            unityContainer<span style="color: #008000;">.</span><span style="color: #0000ff;">RegisterType</span><span style="color: #008000;">&lt;</span>ITestService, TestService<span style="color: #008000;">&gt;</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">}</span>
 
        <span style="color: #0600ff; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">object</span> GetService<span style="color: #008000;">(</span>Type serviceType<span style="color: #008000;">)</span>
        <span style="color: #008000;">{</span>
            <span style="color: #0600ff; font-weight: bold;">return</span> unityContainer<span style="color: #008000;">.</span><span style="color: #0000ff;">IsRegistered</span><span style="color: #008000;">(</span>serviceType<span style="color: #008000;">)</span> <span style="color: #008000;">?</span> 
                unityContainer<span style="color: #008000;">.</span><span style="color: #0000ff;">Resolve</span><span style="color: #008000;">(</span>serviceType<span style="color: #008000;">)</span> <span style="color: #008000;">:</span> <span style="color: #0600ff; font-weight: bold;">null</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">}</span>
 
        <span style="color: #0600ff; font-weight: bold;">public</span> IEnumerable<span style="color: #008000;">&lt;</span><span style="color: #6666cc; font-weight: bold;">object</span><span style="color: #008000;">&gt;</span> GetServices<span style="color: #008000;">(</span>Type serviceType<span style="color: #008000;">)</span>
        <span style="color: #008000;">{</span>
            <span style="color: #0600ff; font-weight: bold;">throw</span> <span style="color: #008000;">new</span> NotImplementedException<span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">}</span>
    <span style="color: #008000;">}</span>
<span style="color: #008000;">}</span></pre>
<p style="text-align: justify;"><span style="font-family: arial,helvetica,sans-serif;">Добавим зависимость <strong>ITestService</strong></span></p>
<pre class="csharp" style="font-size: 12px; font-family: monospace;"><span style="color: #0600ff; font-weight: bold;">namespace</span> UnityDIExample<span style="color: #008000;">.</span><span style="color: #0000ff;">Controllers</span>
<span style="color: #008000;">{</span>
    <span style="color: #0600ff; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> HomeController <span style="color: #008000;">:</span> Controller
    <span style="color: #008000;">{</span>
        <span style="color: #0600ff; font-weight: bold;">private</span> <span style="color: #0600ff; font-weight: bold;">readonly</span> ITestService testService<span style="color: #008000;">;</span>
 
        <span style="color: #0600ff; font-weight: bold;">public</span> HomeController<span style="color: #008000;">(</span>ITestService testService<span style="color: #008000;">)</span>
        <span style="color: #008000;">{</span>
            <span style="color: #0600ff; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000ff;">testService</span> <span style="color: #008000;">=</span> testService<span style="color: #008000;">;</span>
        <span style="color: #008000;">}</span>
 
        <span style="color: #0600ff; font-weight: bold;">public</span> ActionResult Index<span style="color: #008000;">(</span><span style="color: #008000;">)</span>
        <span style="color: #008000;">{</span>
            <span style="color: #0600ff; font-weight: bold;">return</span> View<span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">}</span>
 
        <span style="color: #0600ff; font-weight: bold;">public</span> ActionResult About<span style="color: #008000;">(</span><span style="color: #008000;">)</span>
        <span style="color: #008000;">{</span>
            ViewBag<span style="color: #008000;">.</span><span style="color: #0000ff;">Message</span> <span style="color: #008000;">=</span> <span style="color: #666666;">"Your application description page."</span><span style="color: #008000;">;</span>
 
            <span style="color: #0600ff; font-weight: bold;">return</span> View<span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">}</span>
 
        <span style="color: #0600ff; font-weight: bold;">public</span> ActionResult Contact<span style="color: #008000;">(</span><span style="color: #008000;">)</span>
        <span style="color: #008000;">{</span>
            ViewBag<span style="color: #008000;">.</span><span style="color: #0000ff;">Message</span> <span style="color: #008000;">=</span> <span style="color: #666666;">"Your contact page."</span><span style="color: #008000;">;</span>
 
            <span style="color: #0600ff; font-weight: bold;">return</span> View<span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">}</span>
    <span style="color: #008000;">}</span>
<span style="color: #008000;">}</span></pre>
<p style="text-align: justify;"><span style="font-family: arial,helvetica,sans-serif;">в конроллер и запустим приложение, предварительно задав Dependency resolver в Global.asax.</span></p>
<pre class="csharp" style="font-size: 12px; font-family: monospace;"><span style="color: #0600ff; font-weight: bold;">namespace</span> UnityDIExample
<span style="color: #008000;">{</span>
    <span style="color: #0600ff; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> MvcApplication <span style="color: #008000;">:</span> <span style="color: #000000;">System.<span style="color: #0000ff;">Web</span></span><span style="color: #008000;">.</span><span style="color: #0000ff;">HttpApplication</span>
    <span style="color: #008000;">{</span>
        <span style="color: #0600ff; font-weight: bold;">protected</span> <span style="color: #6666cc; font-weight: bold;">void</span> Application_Start<span style="color: #008000;">(</span><span style="color: #008000;">)</span>
        <span style="color: #008000;">{</span>
            AreaRegistration<span style="color: #008000;">.</span><span style="color: #0000ff;">RegisterAllAreas</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
            FilterConfig<span style="color: #008000;">.</span><span style="color: #0000ff;">RegisterGlobalFilters</span><span style="color: #008000;">(</span>GlobalFilters<span style="color: #008000;">.</span><span style="color: #0000ff;">Filters</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
            RouteConfig<span style="color: #008000;">.</span><span style="color: #0000ff;">RegisterRoutes</span><span style="color: #008000;">(</span>RouteTable<span style="color: #008000;">.</span><span style="color: #0000ff;">Routes</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
            BundleConfig<span style="color: #008000;">.</span><span style="color: #0000ff;">RegisterBundles</span><span style="color: #008000;">(</span>BundleTable<span style="color: #008000;">.</span><span style="color: #0000ff;">Bundles</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
            DependencyResolver<span style="color: #008000;">.</span><span style="color: #0000ff;">SetResolver</span><span style="color: #008000;">(</span><span style="color: #008000;">new</span> UnityDependencyResolver<span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">}</span>
    <span style="color: #008000;">}</span>
<span style="color: #008000;">}</span></pre>
<p style="text-align: justify;"><span style="font-family: arial,helvetica,sans-serif;">Видим, что приложение выбрасывает исключение: "No parameterless constructor defined for this object"</span>. <br /> <br /> <img style="width: 100%;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A68/8461.A68I4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-67-89-A68/8461.A68I4.png" alt="" /> <br /> <br /> <span style="font-family: arial,helvetica,sans-serif;">Дело в том, что стандартный активатор контроллера не может создать экземпляр контроллера без параметров. Чтобы полностью настроить и установить Unity нужен ещё один пакет NuGet, так называемый загрузчик (bootstraper). Установим его используя менеджер пакетов NuGet.</span> <br /> <br /> <img style="width: 100%;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A68/6011.A68I5.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-67-89-A68/6011.A68I5.png" alt="" /> <br /> <br /> <span style="font-family: arial,helvetica,sans-serif;">Как видно из нижнего рисунка в проект добавилось два файла: UnityConfig.cs и UnityMvcActivator.cs.</span><br /> <br /> <img style="width: 100%;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A68/2337.A68I6.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-67-89-A68/2337.A68I6.png" alt="" /> <br /> <br /> <span style="font-family: arial,helvetica,sans-serif;">Первый содержит класс реализующий шаблон &ndash; "Одиночка (Singleton)", для конфигурации контейнера. Именно сюда нужно добавить метод регистрации зависимости <strong>ITestService</strong>, а именно &ndash; <strong>RegisterType&lt;ITestService, TestService&gt;()</strong>. Код показан ниже (оригинальные комментарии удалены в целях экономии места в листинге, их можно будет увидеть в проекте, когда создаются данные файлы).</span></p>
<pre class="csharp" style="font-size: 12px; font-family: monospace;"><span style="color: #0600ff; font-weight: bold;">namespace</span> UnityDIExample<span style="color: #008000;">.</span><span style="color: #0000ff;">App_Start</span>
<span style="color: #008000;">{</span>
    <span style="color: #0600ff; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> UnityConfig
    <span style="color: #008000;">{</span>
        <span style="color: #008080;">#region Unity Container</span>
 
        <span style="color: #0600ff; font-weight: bold;">private</span> <span style="color: #0600ff; font-weight: bold;">static</span> Lazy<span style="color: #008000;">&lt;</span>IUnityContainer<span style="color: #008000;">&gt;</span> container <span style="color: #008000;">=</span>
            <span style="color: #008000;">new</span> Lazy<span style="color: #008000;">&lt;</span>IUnityContainer<span style="color: #008000;">&gt;</span><span style="color: #008000;">(</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span> <span style="color: #008000;">=&gt;</span>
            <span style="color: #008000;">{</span>
                <span style="color: #0600ff; font-weight: bold;">var</span> container <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> UnityContainer<span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
                RegisterTypes<span style="color: #008000;">(</span>container<span style="color: #008000;">)</span><span style="color: #008000;">;</span>
                <span style="color: #0600ff; font-weight: bold;">return</span> container<span style="color: #008000;">;</span>
            <span style="color: #008000;">}</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
 
        <span style="color: #0600ff; font-weight: bold;">public</span> <span style="color: #0600ff; font-weight: bold;">static</span> IUnityContainer GetConfiguredContainer<span style="color: #008000;">(</span><span style="color: #008000;">)</span>
        <span style="color: #008000;">{</span>
            <span style="color: #0600ff; font-weight: bold;">return</span> container<span style="color: #008000;">.</span><span style="color: #0600ff; font-weight: bold;">Value</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">}</span>
        <span style="color: #008080;">#endregion</span>
 
        <span style="color: #0600ff; font-weight: bold;">public</span> <span style="color: #0600ff; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> RegisterTypes<span style="color: #008000;">(</span>IUnityContainer container<span style="color: #008000;">)</span>
        <span style="color: #008000;">{</span>
            <span style="color: #008080; font-style: italic;">// TODO: Register your types here</span>
            container<span style="color: #008000;">.</span><span style="color: #0000ff;">RegisterType</span><span style="color: #008000;">&lt;</span>ITestService, TestService<span style="color: #008000;">&gt;</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">}</span>
    <span style="color: #008000;">}</span>
<span style="color: #008000;">}</span></pre>
<p><span style="font-family: arial,helvetica,sans-serif;">Втрой файл &ndash; UnityMvcActivator.cs содержит методы <strong>Start</strong> и <strong>Shutdown</strong>, которые запускаются на старте приложения уже не через Global.asax, а при помощи атрибутов из сборки WebActivatorEx. Некоторые оригинальные коментарии в коде ниже, также были удалены.</span></p>
<pre class="csharp" style="font-size: 12px; font-family: monospace;"><span style="color: #0600ff; font-weight: bold;">using</span> <span style="color: #008080;">System.Linq</span><span style="color: #008000;">;</span>
<span style="color: #0600ff; font-weight: bold;">using</span> <span style="color: #008080;">System.Web.Mvc</span><span style="color: #008000;">;</span>
<span style="color: #0600ff; font-weight: bold;">using</span> <span style="color: #008080;">Microsoft.Practices.Unity.Mvc</span><span style="color: #008000;">;</span>
 
<span style="color: #008000;">[</span>assembly<span style="color: #008000;">:</span> WebActivatorEx<span style="color: #008000;">.</span><span style="color: #0000ff;">PreApplicationStartMethod</span>
    <span style="color: #008000;">(</span><span style="color: #008000;">typeof</span><span style="color: #008000;">(</span>UnityDIExample<span style="color: #008000;">.</span><span style="color: #0000ff;">App_Start</span><span style="color: #008000;">.</span><span style="color: #0000ff;">UnityWebActivator</span><span style="color: #008000;">)</span>, <span style="color: #666666;">"Start"</span><span style="color: #008000;">)</span><span style="color: #008000;">]</span>
<span style="color: #008000;">[</span>assembly<span style="color: #008000;">:</span> WebActivatorEx<span style="color: #008000;">.</span><span style="color: #0000ff;">ApplicationShutdownMethod</span>
    <span style="color: #008000;">(</span><span style="color: #008000;">typeof</span><span style="color: #008000;">(</span>UnityDIExample<span style="color: #008000;">.</span><span style="color: #0000ff;">App_Start</span><span style="color: #008000;">.</span><span style="color: #0000ff;">UnityWebActivator</span><span style="color: #008000;">)</span>, <span style="color: #666666;">"Shutdown"</span><span style="color: #008000;">)</span><span style="color: #008000;">]</span>
 
<span style="color: #0600ff; font-weight: bold;">namespace</span> UnityDIExample<span style="color: #008000;">.</span><span style="color: #0000ff;">App_Start</span>
<span style="color: #008000;">{</span>
    <span style="color: #0600ff; font-weight: bold;">public</span> <span style="color: #0600ff; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">class</span> UnityWebActivator
    <span style="color: #008000;">{</span>
        <span style="color: #0600ff; font-weight: bold;">public</span> <span style="color: #0600ff; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Start<span style="color: #008000;">(</span><span style="color: #008000;">)</span> 
        <span style="color: #008000;">{</span>
            <span style="color: #0600ff; font-weight: bold;">var</span> container <span style="color: #008000;">=</span> UnityConfig<span style="color: #008000;">.</span><span style="color: #0000ff;">GetConfiguredContainer</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
 
            FilterProviders<span style="color: #008000;">.</span><span style="color: #0000ff;">Providers</span>
                <span style="color: #008000;">.</span><span style="color: #0600ff; font-weight: bold;">Remove</span><span style="color: #008000;">(</span>FilterProviders<span style="color: #008000;">.</span>
                    <span style="color: #0000ff;">Providers</span><span style="color: #008000;">.</span>
                    <span style="color: #0000ff;">OfType</span><span style="color: #008000;">&lt;</span>FilterAttributeFilterProvider<span style="color: #008000;">&gt;</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008000;">.</span><span style="color: #0000ff;">First</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
            FilterProviders<span style="color: #008000;">.</span><span style="color: #0000ff;">Providers</span>
                <span style="color: #008000;">.</span><span style="color: #0600ff; font-weight: bold;">Add</span><span style="color: #008000;">(</span><span style="color: #008000;">new</span> UnityFilterAttributeFilterProvider<span style="color: #008000;">(</span>container<span style="color: #008000;">)</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
 
            DependencyResolver<span style="color: #008000;">.</span>
                <span style="color: #0000ff;">SetResolver</span><span style="color: #008000;">(</span><span style="color: #008000;">new</span> UnityDependencyResolver<span style="color: #008000;">(</span>container<span style="color: #008000;">)</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
 
            <span style="color: #008080; font-style: italic;">// TODO: Uncomment if you want to use PerRequestLifetimeManager</span>
            <span style="color: #008080; font-style: italic;">// Microsoft.Web.Infrastructure.DynamicModuleHelper.</span>
            <span style="color: #008080; font-style: italic;">// DynamicModuleUtility.RegisterModule</span>
            <span style="color: #008080; font-style: italic;">// (typeof(UnityPerRequestHttpModule));</span>
        <span style="color: #008000;">}</span>
 
        <span style="color: #0600ff; font-weight: bold;">public</span> <span style="color: #0600ff; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Shutdown<span style="color: #008000;">(</span><span style="color: #008000;">)</span>
        <span style="color: #008000;">{</span>
            <span style="color: #0600ff; font-weight: bold;">var</span> container <span style="color: #008000;">=</span> UnityConfig<span style="color: #008000;">.</span><span style="color: #0000ff;">GetConfiguredContainer</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
            container<span style="color: #008000;">.</span><span style="color: #0000ff;">Dispose</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">}</span>
    <span style="color: #008000;">}</span>
<span style="color: #008000;">}</span></pre>
<p style="text-align: justify;"><span style="font-family: arial,helvetica,sans-serif;">Можно увидеть, что и тут добавляется UnityDependencyResolver, но он уже не наш, а поставляется вместе с сборкой загрузчика (Unity bootstrapper for ASP.NET MVC).</span> <br /> <br /> <img style="width: 100%;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A68/3240.A68I7.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-67-89-A68/3240.A68I7.png" alt="" width="1184" height="728" /> <br /> <br /> <span style="font-family: arial,helvetica,sans-serif;">Код UnityDependencyResolver можно увидеть ниже. Если покапаться в коде сборки, то можно найти очень много интересного, например HTTP-модуль UnityPerRequestHttpModule. Это уже оставляю вам, дорогой читатель.</span></p>
<pre class="csharp" style="font-size: 12px; font-family: monospace;"><span style="color: #0600ff; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> UnityDependencyResolver <span style="color: #008000;">:</span> IDependencyResolver
<span style="color: #008000;">{</span>
    <span style="color: #0600ff; font-weight: bold;">private</span> <span style="color: #0600ff; font-weight: bold;">readonly</span> IUnityContainer container<span style="color: #008000;">;</span>
 
    <span style="color: #0600ff; font-weight: bold;">public</span> UnityDependencyResolver<span style="color: #008000;">(</span>IUnityContainer container<span style="color: #008000;">)</span>
    <span style="color: #008000;">{</span>
        <span style="color: #0600ff; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000ff;">container</span> <span style="color: #008000;">=</span> container<span style="color: #008000;">;</span>
    <span style="color: #008000;">}</span>
 
    <span style="color: #0600ff; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">object</span> GetService<span style="color: #008000;">(</span>Type serviceType<span style="color: #008000;">)</span>
    <span style="color: #008000;">{</span>
        <span style="color: #0600ff; font-weight: bold;">if</span> <span style="color: #008000;">(</span><span style="color: #008000;">typeof</span><span style="color: #008000;">(</span>IController<span style="color: #008000;">)</span><span style="color: #008000;">.</span><span style="color: #0000ff;">IsAssignableFrom</span><span style="color: #008000;">(</span>serviceType<span style="color: #008000;">)</span><span style="color: #008000;">)</span>
        <span style="color: #008000;">{</span>
            <span style="color: #0600ff; font-weight: bold;">return</span> UnityContainerExtensions
                <span style="color: #008000;">.</span><span style="color: #0000ff;">Resolve</span><span style="color: #008000;">(</span><span style="color: #0600ff; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000ff;">container</span>,
                    serviceType, <span style="color: #008000;">new</span> ResolverOverride<span style="color: #008000;">[</span><span style="color: #ff0000;">0</span><span style="color: #008000;">]</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">}</span>
        <span style="color: #0600ff; font-weight: bold;">try</span>
        <span style="color: #008000;">{</span>
            <span style="color: #0600ff; font-weight: bold;">return</span> UnityContainerExtensions
                <span style="color: #008000;">.</span><span style="color: #0000ff;">Resolve</span><span style="color: #008000;">(</span><span style="color: #0600ff; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000ff;">container</span>,
                    serviceType, <span style="color: #008000;">new</span> ResolverOverride<span style="color: #008000;">[</span><span style="color: #ff0000;">0</span><span style="color: #008000;">]</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">}</span>
        <span style="color: #0600ff; font-weight: bold;">catch</span> <span style="color: #008000;">(</span>ResolutionFailedException<span style="color: #008000;">)</span>
        <span style="color: #008000;">{</span>
            <span style="color: #0600ff; font-weight: bold;">return</span> <span style="color: #0600ff; font-weight: bold;">null</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">}</span>
    <span style="color: #008000;">}</span>
 
    <span style="color: #0600ff; font-weight: bold;">public</span> IEnumerable<span style="color: #008000;">&lt;</span><span style="color: #6666cc; font-weight: bold;">object</span><span style="color: #008000;">&gt;</span> GetServices<span style="color: #008000;">(</span>Type serviceType<span style="color: #008000;">)</span>
    <span style="color: #008000;">{</span>
        <span style="color: #0600ff; font-weight: bold;">return</span> <span style="color: #0600ff; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000ff;">container</span><span style="color: #008000;">.</span>
            <span style="color: #0000ff;">ResolveAll</span><span style="color: #008000;">(</span>serviceType, <span style="color: #008000;">new</span> ResolverOverride<span style="color: #008000;">[</span><span style="color: #ff0000;">0</span><span style="color: #008000;">]</span><span style="color: #008000;">)</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">}</span>
<span style="color: #008000;">}</span>
 </pre>
<p style="text-align: justify;"><span style="font-family: arial,helvetica,sans-serif;">Теперь если запустить приложение, то всё будет работать.</span> <br /> <br /> <img style="width: 100%;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A68/5100.A68I8.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-67-89-A68/5100.A68I8.png" alt="" /> <br /> <br /><span style="font-family: arial,helvetica,sans-serif;"> И если вы решите использовать Unity в своём приложении (рекомендую почитать <a href="https://msdn.microsoft.com/en-us/library/dn170416.aspx">данный раздел</a> в MSDN, доступна и PDF версия руководства), надеюсь, что данная статья поможет вам быстро сконфигурировать DI-контейнер.</span></p>]]></content:encoded>
    </item>
    <item>
      <title>Microsoft OWIN и конвейер обработки запросов ASP.NET. Часть четвёртая, OWIN и конвейер обработки запросов IIS/ASP.NET.</title>
      <link>https://docs.microsoft.com/archive/blogs/yatajga/microsoft-owin</link>
      <pubDate>Fri, 26 Dec 2014 00:04:00 GMT</pubDate>
      <dc:creator><![CDATA[Yatajga]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/yatajga/2014/12/26/microsoft-owin/</guid>
      <description><![CDATA[Данная статья последняя из серии&nbsp;"Конвейер обработки запросов IIS/ASP.NET и спецификация...]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Данная статья последняя из серии&nbsp;<strong>"Конвейер обработки запросов IIS/ASP.NET и спецификация OWIN"</strong>&nbsp;и содержит иллюстрацию схемы конвейера IIS/ASP.NET в случае когда применяется спецификация OWIN. Также будет дано краткое описание того, что происходит внутри ковейера и как он работает. Для начала, ниже показана схема конвейера, подобная тому, которая была приведена&nbsp;<a href="https://blogs.msdn.com/b/yatajga/archive/2014/12/23/microsoft-owin-asp-net-iis-asp-net-owin.aspx" target="_blank">здесь</a>. Для тех кому будет интересно покапаться в коде ещё глубже, есть&nbsp;<a href="https://code.msdn.microsoft.com/The-web-application-with-e57d6345" target="_blank">готовый проект</a>&nbsp;приложения. Можно скачать и эксперементировать используя&nbsp;<a href="https://www.msdr.ru/55/" target="_blank">символы отладки</a>&nbsp;.NET Framework или&nbsp;<a href="https://www.msdr.ru/40/" target="_blank">.NET Reflector</a>.</span></p>
<p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A54/7230.A54I1.jpg" alt="" /></p>
<p><span style="font-family: arial,helvetica,sans-serif">Из рисунка (<a href="https://www.msdr.ru/files/IIS%20and%20ASP.NET%20pipline%20with%20OWIN%20v1.0.pdf">ссылка</a> на pdf файл высокого качества) видно, что ключевую роль здесь играет обычный HTTP-модуль, который подключает конвейер OWIN.</span><br /><br /></p>
<pre class="csharp" style="font-size: 12px;font-family: monospace"><span style="color: #0600ff;font-weight: bold">namespace</span> Microsoft<span style="color: #008000">.</span><span style="color: #0000ff">Owin</span><span style="color: #008000">.</span><span style="color: #0000ff">Host</span><span style="color: #008000">.</span><span style="color: #0000ff">SystemWeb</span>
<span style="color: #008000">{</span>
    <span style="color: #0600ff;font-weight: bold">using</span> <span style="color: #008080">AppFunc </span><span style="color: #008000">=</span> Func<span style="color: #008000">&lt;</span>IDictionary<span style="color: #008000">&lt;</span><span style="color: #6666cc;font-weight: bold">string</span>, <span style="color: #6666cc;font-weight: bold">object</span><span style="color: #008000">&gt;</span>, Task<span style="color: #008000">&gt;;</span>
&nbsp;
    <span style="color: #0600ff;font-weight: bold">internal</span> <span style="color: #0600ff;font-weight: bold">sealed</span> <span style="color: #6666cc;font-weight: bold">class</span> OwinHttpModule <span style="color: #008000">:</span> IHttpModule
    <span style="color: #008000">{</span>
        <span style="color: #0600ff;font-weight: bold">private</span> <span style="color: #0600ff;font-weight: bold">static</span> IntegratedPipelineBlueprint _blueprint<span style="color: #008000">;</span>
        <span style="color: #0600ff;font-weight: bold">private</span> <span style="color: #0600ff;font-weight: bold">static</span> <span style="color: #6666cc;font-weight: bold">bool</span> _blueprintInitialized<span style="color: #008000">;</span>
        <span style="color: #0600ff;font-weight: bold">private</span> <span style="color: #0600ff;font-weight: bold">static</span> <span style="color: #6666cc;font-weight: bold">object</span> _blueprintLock <span style="color: #008000">=</span> <span style="color: #008000">new</span> <span style="color: #6666cc;font-weight: bold">object</span><span style="color: #008000">(</span><span style="color: #008000">)</span><span style="color: #008000">;</span>
&nbsp;
        <span style="color: #0600ff;font-weight: bold">public</span> <span style="color: #6666cc;font-weight: bold">void</span> Init<span style="color: #008000">(</span>HttpApplication context<span style="color: #008000">)</span>
        <span style="color: #008000">{</span>
            IntegratedPipelineBlueprint blueprint <span style="color: #008000">=</span>
                LazyInitializer<span style="color: #008000">.</span><span style="color: #0000ff">EnsureInitialized</span><span style="color: #008000">(</span>
                    <span style="color: #0600ff;font-weight: bold">ref</span> _blueprint,
                    <span style="color: #0600ff;font-weight: bold">ref</span> _blueprintInitialized,
                    <span style="color: #0600ff;font-weight: bold">ref</span> _blueprintLock,
                    InitializeBlueprint<span style="color: #008000">)</span><span style="color: #008000">;</span>
&nbsp;
            <span style="color: #0600ff;font-weight: bold">if</span> <span style="color: #008000">(</span>blueprint <span style="color: #008000">!=</span> <span style="color: #0600ff;font-weight: bold">null</span><span style="color: #008000">)</span>
            <span style="color: #008000">{</span>
                <span style="color: #0600ff;font-weight: bold">var</span> integratedPipelineContext <span style="color: #008000">=</span>
                    <span style="color: #008000">new</span> IntegratedPipelineContext<span style="color: #008000">(</span>blueprint<span style="color: #008000">)</span><span style="color: #008000">;</span>
                integratedPipelineContext<span style="color: #008000">.</span><span style="color: #0000ff">Initialize</span><span style="color: #008000">(</span>context<span style="color: #008000">)</span><span style="color: #008000">;</span>
            <span style="color: #008000">}</span>
        <span style="color: #008000">}</span>
&nbsp;
        <span style="color: #0600ff;font-weight: bold">public</span> <span style="color: #6666cc;font-weight: bold">void</span> Dispose<span style="color: #008000">(</span><span style="color: #008000">)</span>
        <span style="color: #008000">{</span>
        <span style="color: #008000">}</span>
&nbsp;
        <span style="color: #0600ff;font-weight: bold">private</span> IntegratedPipelineBlueprint InitializeBlueprint<span style="color: #008000">(</span><span style="color: #008000">)</span>
        <span style="color: #008000">{</span>
            IntegratedPipelineBlueprintStage firstStage <span style="color: #008000">=</span> <span style="color: #0600ff;font-weight: bold">null</span><span style="color: #008000">;</span>
&nbsp;
            Action<span style="color: #008000">&lt;</span>IAppBuilder<span style="color: #008000">&gt;</span> startup <span style="color: #008000">=</span> OwinBuilder<span style="color: #008000">.</span><span style="color: #0000ff">GetAppStartup</span><span style="color: #008000">(</span><span style="color: #008000">)</span><span style="color: #008000">;</span>
            OwinAppContext appContext <span style="color: #008000">=</span> OwinBuilder<span style="color: #008000">.</span><span style="color: #0000ff">Build</span><span style="color: #008000">(</span>builder <span style="color: #008000">=&gt;</span>
            <span style="color: #008000">{</span>
                EnableIntegratedPipeline<span style="color: #008000">(</span>builder, stage <span style="color: #008000">=&gt;</span> firstStage <span style="color: #008000">=</span> stage<span style="color: #008000">)</span><span style="color: #008000">;</span>
                startup<span style="color: #008000">.</span><span style="color: #0000ff">Invoke</span><span style="color: #008000">(</span>builder<span style="color: #008000">)</span><span style="color: #008000">;</span>
            <span style="color: #008000">}</span><span style="color: #008000">)</span><span style="color: #008000">;</span>
&nbsp;
            <span style="color: #6666cc;font-weight: bold">string</span> basePath <span style="color: #008000">=</span> 
                Utils<span style="color: #008000">.</span><span style="color: #0000ff">NormalizePath</span><span style="color: #008000">(</span>HttpRuntime<span style="color: #008000">.</span><span style="color: #0000ff">AppDomainAppVirtualPath</span><span style="color: #008000">)</span><span style="color: #008000">;</span>
&nbsp;
            <span style="color: #0600ff;font-weight: bold">return</span> <span style="color: #008000">new</span> IntegratedPipelineBlueprint<span style="color: #008000">(</span>
                appContext, firstStage, basePath<span style="color: #008000">)</span><span style="color: #008000">;</span>
        <span style="color: #008000">}</span>
&nbsp;
        <span style="color: #0600ff;font-weight: bold">private</span> <span style="color: #0600ff;font-weight: bold">static</span> <span style="color: #6666cc;font-weight: bold">void</span> EnableIntegratedPipeline<span style="color: #008000">(</span>IAppBuilder app,
            Action<span style="color: #008000">&lt;</span>IntegratedPipelineBlueprintStage<span style="color: #008000">&gt;</span> onStageCreated<span style="color: #008000">)</span>
        <span style="color: #008000">{</span>
            <span style="color: #0600ff;font-weight: bold">var</span> stage <span style="color: #008000">=</span>
                <span style="color: #008000">new</span> IntegratedPipelineBlueprintStage
                <span style="color: #008000">{</span>Name <span style="color: #008000">=</span> <span style="color: #666666">"PreHandlerExecute"</span><span style="color: #008000">}</span><span style="color: #008000">;</span>
            onStageCreated<span style="color: #008000">(</span>stage<span style="color: #008000">)</span><span style="color: #008000">;</span>
            Action<span style="color: #008000">&lt;</span>IAppBuilder, <span style="color: #6666cc;font-weight: bold">string</span><span style="color: #008000">&gt;</span> stageMarker <span style="color: #008000">=</span> <span style="color: #008000">(</span>builder, name<span style="color: #008000">)</span> <span style="color: #008000">=&gt;</span>
            <span style="color: #008000">{</span>
                Func<span style="color: #008000">&lt;</span>AppFunc, AppFunc<span style="color: #008000">&gt;</span> decoupler <span style="color: #008000">=</span> next <span style="color: #008000">=&gt;</span>
                <span style="color: #008000">{</span>
                    <span style="color: #0600ff;font-weight: bold">if</span> <span style="color: #008000">(</span><span style="color: #6666cc;font-weight: bold">string</span><span style="color: #008000">.</span><span style="color: #0000ff">Equals</span><span style="color: #008000">(</span>name, stage<span style="color: #008000">.</span><span style="color: #0000ff">Name</span>, 
                        StringComparison<span style="color: #008000">.</span><span style="color: #0000ff">OrdinalIgnoreCase</span><span style="color: #008000">)</span><span style="color: #008000">)</span>
                    <span style="color: #008000">{</span>
                        <span style="color: #008080;font-style: italic">// no decoupling needed when </span>
                        <span style="color: #008080;font-style: italic">// pipeline is already split at this name</span>
                        <span style="color: #0600ff;font-weight: bold">return</span> next<span style="color: #008000">;</span>
                    <span style="color: #008000">}</span>
                    <span style="color: #0600ff;font-weight: bold">if</span> <span style="color: #008000">(</span><span style="color: #008000">!</span>IntegratedPipelineContext<span style="color: #008000">.</span><span style="color: #0000ff">VerifyStageOrder</span><span style="color: #008000">(</span>
                        name, stage<span style="color: #008000">.</span><span style="color: #0000ff">Name</span><span style="color: #008000">)</span><span style="color: #008000">)</span>
                    <span style="color: #008000">{</span>
                        <span style="color: #008080;font-style: italic">// Stage markers added out of order will be ignored.</span>
                        <span style="color: #008080;font-style: italic">// Out of order stages/middleware </span>
                        <span style="color: #008080;font-style: italic">// may be run earlier than expected.</span>
                        <span style="color: #008080;font-style: italic">// TODO: LOG</span>
                        <span style="color: #0600ff;font-weight: bold">return</span> next<span style="color: #008000">;</span>
                    <span style="color: #008000">}</span>
                    stage<span style="color: #008000">.</span><span style="color: #0000ff">EntryPoint</span> <span style="color: #008000">=</span> next<span style="color: #008000">;</span>
                    stage <span style="color: #008000">=</span> <span style="color: #008000">new</span> IntegratedPipelineBlueprintStage
                    <span style="color: #008000">{</span>
                        Name <span style="color: #008000">=</span> name,
                        NextStage <span style="color: #008000">=</span> stage,
                    <span style="color: #008000">}</span><span style="color: #008000">;</span>
                    onStageCreated<span style="color: #008000">(</span>stage<span style="color: #008000">)</span><span style="color: #008000">;</span>
                    <span style="color: #0600ff;font-weight: bold">return</span> <span style="color: #008000">(</span>AppFunc<span style="color: #008000">)</span>IntegratedPipelineContext<span style="color: #008000">.</span><span style="color: #0000ff">ExitPointInvoked</span><span style="color: #008000">;</span>
                <span style="color: #008000">}</span><span style="color: #008000">;</span>
                app<span style="color: #008000">.</span><span style="color: #0000ff">Use</span><span style="color: #008000">(</span>decoupler<span style="color: #008000">)</span><span style="color: #008000">;</span>
            <span style="color: #008000">}</span><span style="color: #008000">;</span>
            app<span style="color: #008000">.</span><span style="color: #0000ff">Properties</span><span style="color: #008000">[</span>Constants<span style="color: #008000">.</span><span style="color: #0000ff">IntegratedPipelineStageMarker</span><span style="color: #008000">]</span> 
                <span style="color: #008000">=</span> stageMarker<span style="color: #008000">;</span>
            app<span style="color: #008000">.</span><span style="color: #0000ff">Properties</span><span style="color: #008000">[</span>Constants<span style="color: #008000">.</span><span style="color: #0000ff">BuilderDefaultApp</span><span style="color: #008000">]</span> <span style="color: #008000">=</span>
                <span style="color: #008000">(</span>Func<span style="color: #008000">&lt;</span>IDictionary<span style="color: #008000">&lt;</span><span style="color: #6666cc;font-weight: bold">string</span>, <span style="color: #6666cc;font-weight: bold">object</span><span style="color: #008000">&gt;</span>, Task<span style="color: #008000">&gt;</span><span style="color: #008000">)</span>
                IntegratedPipelineContext<span style="color: #008000">.</span><span style="color: #0000ff">DefaultAppInvoked</span><span style="color: #008000">;</span>
        <span style="color: #008000">}</span>
    <span style="color: #008000">}</span>
<span style="color: #008000">}</span></pre>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Как видно из вышеприведённого кода, модуль не подписывается на события приложения <strong>HttpApplication</strong>, а инициализирует конвейер на стадии загрузки и инициализации модулей.</span></p>
<pre class="csharp" style="font-size: 12px;font-family: monospace"><span style="color: #0600ff;font-weight: bold">for</span> <span style="color: #008000">(</span><span style="color: #6666cc;font-weight: bold">int</span> i <span style="color: #008000">=</span> <span style="color: #ff0000">0</span><span style="color: #008000">;</span> i <span style="color: #008000">&lt;</span> <span style="color: #0600ff;font-weight: bold">this</span><span style="color: #008000">.</span>_moduleCollection<span style="color: #008000">.</span><span style="color: #0000ff">Count</span><span style="color: #008000">;</span> i<span style="color: #008000">++</span><span style="color: #008000">)</span>
<span style="color: #008000">{</span>
    <span style="color: #0600ff;font-weight: bold">this</span><span style="color: #008000">.</span>_currentModuleCollectionKey <span style="color: #008000">=</span> <span style="color: #0600ff;font-weight: bold">this</span><span style="color: #008000">.</span>_moduleCollection<span style="color: #008000">.</span><span style="color: #0000ff">GetKey</span><span style="color: #008000">(</span>i<span style="color: #008000">)</span><span style="color: #008000">;</span>
    IHttpModule module <span style="color: #008000">=</span> <span style="color: #0600ff;font-weight: bold">this</span><span style="color: #008000">.</span>_moduleCollection<span style="color: #008000">.</span><span style="color: #0600ff;font-weight: bold">Get</span><span style="color: #008000">(</span>i<span style="color: #008000">)</span><span style="color: #008000">;</span>
    ModuleConfigurationInfo info <span style="color: #008000">=</span> _moduleConfigInfo<span style="color: #008000">[</span>i<span style="color: #008000">]</span><span style="color: #008000">;</span>
    module<span style="color: #008000">.</span><span style="color: #0000ff">Init</span><span style="color: #008000">(</span><span style="color: #0600ff;font-weight: bold">this</span><span style="color: #008000">)</span><span style="color: #008000">;</span>
    <span style="color: #0600ff;font-weight: bold">this</span><span style="color: #008000">.</span><span style="color: #0000ff">ProcessEventSubscriptions</span><span style="color: #008000">(</span><span style="color: #0600ff;font-weight: bold">out</span> notification, <span style="color: #0600ff;font-weight: bold">out</span> notification2<span style="color: #008000">)</span><span style="color: #008000">;</span>
    <span style="color: #0600ff;font-weight: bold">if</span> <span style="color: #008000">(</span><span style="color: #008000">(</span>notification <span style="color: #008000">!=</span> <span style="color: #ff0000">0</span><span style="color: #008000">)</span> <span style="color: #008000">||</span> <span style="color: #008000">(</span>notification2 <span style="color: #008000">!=</span> <span style="color: #ff0000">0</span><span style="color: #008000">)</span><span style="color: #008000">)</span>
    <span style="color: #008000">{</span>
        <span style="color: #0600ff;font-weight: bold">this</span><span style="color: #008000">.</span><span style="color: #0000ff">RegisterIntegratedEvent</span><span style="color: #008000">(</span>appContext, info<span style="color: #008000">.</span><span style="color: #0000ff">Name</span>, notification,
			notification2, info<span style="color: #008000">.</span><span style="color: #0000ff">Type</span>, info<span style="color: #008000">.</span><span style="color: #0000ff">Precondition</span>, <span style="color: #0600ff;font-weight: bold">false</span><span style="color: #008000">)</span><span style="color: #008000">;</span>
    <span style="color: #008000">}</span>
<span style="color: #008000">}</span></pre>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">А поскольку экземпляры HttpApplication создаются фабрикой HttpApplicationFactory и переиспользуются, то и повторное подключение конвейера OWIN не нужно, да и к тому же экземпляр основного типа IntegratedPipelineBlueprint (который и есть, грубо говоря, конвейер OWIN) один единственный на домен приложения (используется статическая ссылка и отложенная инициализация с проверкой на наличие экземпляра последней). Метод <strong>InitializeBlueprint</strong></span></p>
<pre class="csharp" style="font-size: 12px;font-family: monospace"><span style="color: #0600ff;font-weight: bold">private</span> IntegratedPipelineBlueprint InitializeBlueprint<span style="color: #008000">(</span><span style="color: #008000">)</span>
<span style="color: #008000">{</span>
    IntegratedPipelineBlueprintStage firstStage <span style="color: #008000">=</span> <span style="color: #0600ff;font-weight: bold">null</span><span style="color: #008000">;</span>
    Action<span style="color: #008000">&lt;</span>IAppBuilder<span style="color: #008000">&gt;</span> startup <span style="color: #008000">=</span> OwinBuilder<span style="color: #008000">.</span><span style="color: #0000ff">GetAppStartup</span><span style="color: #008000">(</span><span style="color: #008000">)</span><span style="color: #008000">;</span>
    OwinAppContext appContext <span style="color: #008000">=</span> OwinBuilder<span style="color: #008000">.</span><span style="color: #0000ff">Build</span><span style="color: #008000">(</span><span style="color: #6666cc;font-weight: bold">delegate</span> <span style="color: #008000">(</span>IAppBuilder builder<span style="color: #008000">)</span> <span style="color: #008000">{</span>
        EnableIntegratedPipeline<span style="color: #008000">(</span>builder, stage <span style="color: #008000">=&gt;</span> firstStage <span style="color: #008000">=</span> stage<span style="color: #008000">)</span><span style="color: #008000">;</span>
        startup<span style="color: #008000">(</span>builder<span style="color: #008000">)</span><span style="color: #008000">;</span>
    <span style="color: #008000">}</span><span style="color: #008000">)</span><span style="color: #008000">;</span>
    <span style="color: #0600ff;font-weight: bold">return</span> <span style="color: #008000">new</span> IntegratedPipelineBlueprint<span style="color: #008000">(</span>appContext, firstStage,
		Utils<span style="color: #008000">.</span><span style="color: #0000ff">NormalizePath</span><span style="color: #008000">(</span>HttpRuntime<span style="color: #008000">.</span><span style="color: #0000ff">AppDomainAppVirtualPath</span><span style="color: #008000">)</span><span style="color: #008000">)</span><span style="color: #008000">;</span>
<span style="color: #008000">}</span></pre>
<p><span style="font-family: arial,helvetica,sans-serif">создаёт <a href="https://code.msdn.microsoft.com/The-web-application-with-e57d6345" target="_blank">экземпляр построителя</a> приложения на основе <a href="https://blogs.msdn.com/b/yatajga/archive/2014/12/23/microsoft-owin-asp-net-owin-microsoft-katana.aspx" target="_blank">метода конфигурации</a>.</span></p>
<pre class="csharp" style="font-size: 12px;font-family: monospace"><span style="color: #008000">[</span>assembly<span style="color: #008000">:</span> Microsoft<span style="color: #008000">.</span><span style="color: #0000ff">Owin</span><span style="color: #008000">.</span><span style="color: #0000ff">OwinStartup</span><span style="color: #008000">(</span><span style="color: #008000">typeof</span><span style="color: #008000">(</span>Startup<span style="color: #008000">)</span><span style="color: #008000">)</span><span style="color: #008000">]</span>
&nbsp;
<span style="color: #0600ff;font-weight: bold">namespace</span> SignalROwinIISApplication
<span style="color: #008000">{</span>
    <span style="color: #0600ff;font-weight: bold">public</span> <span style="color: #6666cc;font-weight: bold">class</span> Startup
    <span style="color: #008000">{</span>
        <span style="color: #0600ff;font-weight: bold">public</span> <span style="color: #6666cc;font-weight: bold">void</span> Configuration<span style="color: #008000">(</span>IAppBuilder appBuilder<span style="color: #008000">)</span>
        <span style="color: #008000">{</span>
            appBuilder<span style="color: #008000">.</span><span style="color: #0000ff">MapSignalR</span><span style="color: #008000">(</span><span style="color: #008000">)</span><span style="color: #008000">;</span>
&nbsp;
            <span style="color: #0600ff;font-weight: bold">var</span> httpConfiguration <span style="color: #008000">=</span> <span style="color: #008000">new</span> HttpConfiguration<span style="color: #008000">(</span><span style="color: #008000">)</span><span style="color: #008000">;</span>
&nbsp;
            httpConfiguration<span style="color: #008000">.</span><span style="color: #0000ff">Formatters</span><span style="color: #008000">.</span><span style="color: #0000ff">Clear</span><span style="color: #008000">(</span><span style="color: #008000">)</span><span style="color: #008000">;</span>
            httpConfiguration<span style="color: #008000">.</span><span style="color: #0000ff">Formatters</span><span style="color: #008000">.</span><span style="color: #0600ff;font-weight: bold">Add</span><span style="color: #008000">(</span><span style="color: #008000">new</span> JsonMediaTypeFormatter<span style="color: #008000">(</span><span style="color: #008000">)</span><span style="color: #008000">)</span><span style="color: #008000">;</span>
&nbsp;
            httpConfiguration<span style="color: #008000">.</span><span style="color: #0000ff">Formatters</span><span style="color: #008000">.</span><span style="color: #0000ff">JsonFormatter</span><span style="color: #008000">.</span><span style="color: #0000ff">SerializerSettings</span> <span style="color: #008000">=</span> 
                <span style="color: #008000">new</span> JsonSerializerSettings
            <span style="color: #008000">{</span>
                ContractResolver <span style="color: #008000">=</span> <span style="color: #008000">new</span> CamelCasePropertyNamesContractResolver<span style="color: #008000">(</span><span style="color: #008000">)</span>
            <span style="color: #008000">}</span><span style="color: #008000">;</span>
&nbsp;
            httpConfiguration<span style="color: #008000">.</span><span style="color: #0000ff">Routes</span><span style="color: #008000">.</span><span style="color: #0000ff">MapHttpRoute</span><span style="color: #008000">(</span>
                name<span style="color: #008000">:</span> <span style="color: #666666">"DefaultApi"</span>,
                routeTemplate<span style="color: #008000">:</span> <span style="color: #666666">"api/{controller}/{id}"</span>,
                defaults<span style="color: #008000">:</span> <span style="color: #008000">new</span> <span style="color: #008000">{</span> id <span style="color: #008000">=</span> RouteParameter<span style="color: #008000">.</span><span style="color: #0000ff">Optional</span> <span style="color: #008000">}</span><span style="color: #008000">)</span><span style="color: #008000">;</span>
&nbsp;
            appBuilder<span style="color: #008000">.</span><span style="color: #0000ff">UseWebApi</span><span style="color: #008000">(</span>httpConfiguration<span style="color: #008000">)</span><span style="color: #008000">;</span>
        <span style="color: #008000">}</span>
    <span style="color: #008000">}</span>
<span style="color: #008000">}</span></pre>
<p><span style="font-family: arial,helvetica,sans-serif">Тем самым подключаются два <strong>Модуля OWIN</strong>: SignalR и WebAPI. Именно <a href="https://blogs.msdn.com/b/yatajga/archive/2014/12/26/microsoft-owin-asp-net-owin-iis-asp-net.aspx" target="_blank">они будут обрабатывать запросы</a> поступающие к этим двум фреймворкам.</span></p>
<p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/67/89/A54/4520.A54I2.jpg" alt="" /></p>
<p style="text-align: justify"><span style="font-family: arial,helvetica,sans-serif">Ну а остальные запросы, например к Web Forms или MVC, будут идти как обычно, в обход спецификации OWIN, так как <a href="https://blogs.msdn.com/b/yatajga/archive/2014/12/23/microsoft-owin-asp-net-owin-microsoft-katana.aspx" target="_blank">они эту спецификацию не реализуют</a>. В данной статье я попытался показать насколько усложняется конвейер IIS/ASP.NET при использовании спецификации OWIN. А он как уже известно, и так устроен очень непросто.</span></p>]]></content:encoded>
    </item>
  </channel>
</rss>