OWIN и Katana. Часть 1 – Что это?

Наверное многие разработчики уже сталкивались с названиями OWIN и Katana в статьях и презентациях Microsoft. Давайте разберемся что и для чего это нужно.

Немного истории

Рассмотрим классическое ASP.NET веб-приложение. Характерной его чертой является зависимость от System.Web. Эта сборка входит в .NET Framework и, по сути, представляет функциональность IIS. Схематически это представить следующим образом:

IIS web application

Здесь сразу можно отметить первый недостаток – сильная связь веб-приложения с System.Web. Это означает, что перенести его на другой тип сервера (например, self-host) без изменений не возможно.

Второй недостаток виден не сразу. System.Web это часть .NET Framework , а значит её новые версии появляются только с очередным обновлением самой платформы. С учетом текущих темпов развития веб-технологий это достаточно медленно.

Разработчики в Microsoft решили исправить ситуацию. Первым шагом стали NuGet и библиотека ASP.NET MVC. Её обновления стали появляться чаще, чем новые версии .NET Framework. Затем проследовала ASP.NET WebAPI, у которой к тому же не было зависимости от System.Web. И наконец, вышла signalR с аналогичными свойствами.

Стало ясно, что нужная некая абстракция, представляющая собой сервер и позволяющая строить свой конвейер обработки запросов. Так появились OWIN и Katana.

OWIN

OWIN (Open Web Interface for .NET) – это спецификация (не библиотека и не платформа), определяющая интерфейс, который устраняет сильную связанность веб-приложения с конкретной реализацией сервера. Схематически это выглядит так:

OWIN web application

Это позволяет запускать приложение на любой платформе, поддерживающей OWIN, без изменений. Для работы оно использует готовые или созданные самим разработчиком модули. В свою очередь, спецификация задает интерфейс взаимодействия последних с сервером. Её основа – делегат:

using AppFunc = Func<
    IDictionary<string, object>, // Environment
    Task>; // Done

Он отвечает за обработку запроса к серверу. Параметр IDictionary<string, object> содержит текущее окружение сервера, запрос и ответ (имена ключей описаны в спецификации). Результатом является объект типа Task, т.е. некая выполняемая задача.

В момент запуска веб-приложения, разработчик конфигурирует нужные модули в конвейер обработки запросов. Таким образом используется только необходимая функциональность.

Еще раз стоит подчеркнуть, что и модули и приложения, написанные для OWIN , способны работать на различных типах серверов. Так достигается гибкость решения. Это хорошо заметно на примере библиотек WebAPI и signalR, которые могут работать как под IIS, так и в отдельном приложении.

Может показаться, что для создания даже самого простого решения необходим большой объем кода. Ведь разработчик остается один на один с запросом и формированием ответа на него. Кроме того, требуется реализация OWIN для конкретного веб-сервера. Здесь на помощь приходит проект Katana.

Katana

Katana – это реализация спецификации OWIN от Microsoft, которая:

  • позволяет запускать приложения под IIS и в виде самостоятельного приложения (self-host);
  • предоставляет вспомог��тельные типы и методы, которые упрощают создание модулей OWIN. Например, вместо IDictionary – удобные объекты OwinRequest и OwinResponse.

В её рамках уже разработаны и доступны модули WebAPI и signalR.

Возможно некоторые разработчики зададутся вопросом – не придется ли теперь все изучать c нуля? Ответ: нет. Нововведения касаются только кода, который связан непосредственно с веб-сервером. Например то, что настраивалось в global.aspx. Вместо него появляется класс Startup для настройки модулей. Интерфейсы и принципы работы signalR и WebAPI не изменяются.

В следующей части рассмотрим создание простого веб-приложения с использованием Katana и WebAPI.

Комментарии (12) -

Думаю МС стремится уйти от монополии IIS в хостинге ASP.NET приложений. Что не может не радовать. Smile

Евгений Веприков 19.07.2013 17:21:40

Производительность по сравнению с хостингом в IIS будет много хуже. Плюс море багов.

@ Евгений Веприков: С чего такой вывод (да и что с чем сравнивали)?

@ Denis: Кстати, говорят что Katana будет работать под Mono. Как я понимаю, тогда ASP.NET WebAPI приложение (само совместимое с Mono) можно будет запустить под Linux.

@ Andrey: еще один аргумент по данной теме это open source направленность МС в последние годы. Возможно, в такой способ пытаются привлечь внимание разработчиков серверов.

Алексей 20.07.2013 4:33:49

«Может показаться, что для создания даже самого простого решения необходим большой объем кода.»

— вам не показалось.

system.web решает львиную долю насущных вопросов, которые придется решать самостоятельно. кстати, зато возможно на OWIN реализовать что-то типа Adobe AIR, что не может не радовать Smile

@ Алексей: Именно что кажется. Если вы размещаете приложение на IIS, то OWIN это интерфейс к System.Web (и она никуда не исчезда). Если же у вас другой сервер, то "львиную долю насущных вопросов" у вас или уже и так решена в другой сборке или придется в любом случае решать.
Тут именно вопрос в абстракции. Вы получаете удобный метод конфигурирования конвейера и возможность смены сервера.

@ Евгений Веприков: Вряд ли, все будет работать по минимуму и по делу, IIS сильно перегружен фичами, которые нужны не всегда. Насколько я понял из этой статьи www.codehint.ru/.../2013-07-07_owin_getting_started

@ Vasiliy: Когда понимаешь свои статьи это круто. Smile PS: Ссылки по теме не удаляю. Smile

Здравствуйте, я столкнулся с некими проблемами при переносе кода с Global.asax.cs в Startup.cs. Я использую Bootstrapper для IoC контейнера и когда, добавляю следующий код в Startup.cs
{code}
Bootstrapper.IncludingOnly.Assembly(Assembly.Load("Dashboard.Rest")).With.SimpleInjector().With.ServiceLocator().Start();
Container container = Bootstrapper.Container as Container;
GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
{code}

Получаю ошибку
An exception of type 'Bootstrap.Extensions.Containers.NoContainerException' occurred in Bootstrapper.dll but was not handled in user code
Additional information: Unable to continue. The container has not been initialized.

Возможно вы знаете как это можно исправить.
Более детально суть проблемы я описал на SO.
stackoverflow.com/.../owin-and-global-asax-cs-file

Спасибо

@Taras я так понимаю (перейдя по ссылке) проблема решена.

Я просто использую другой IOC контейнер, но с бутстраппером у меня так и нечего не получилось. Если вы знаете ответ буду только рад. Спасибо.

Добавить комментарий