OWIN и Katana — что такое промежуточное ПО на самом деле?

При работе с Katana Project мы много имеем дело с промежуточным программным обеспечением. На сайте ASP.NET они говорят

Как упоминалось ранее, когда сервер принимает запрос от клиента, он отвечает за его передачу через конвейер компонентов OWIN, которые указаны в коде запуска разработчика. Эти компоненты конвейера известны как промежуточное ПО.

Это хорошо, но я совсем не понимаю. Сначала я думал, что промежуточное программное обеспечение — это компоненты ASP.NET, такие как WebAPI, SignalR и все такое. Однако при изучении аутентификации я увидел промежуточное ПО для аутентификации файлов cookie. Это не полная структура, такая как WebAPI, поэтому она не соответствует моей первоначальной идее промежуточного программного обеспечения.

Так что же такое промежуточное ПО Katana? Это просто фрагменты кода, которые можно интегрировать в конвейер выполнения и работать со словарем среды? Итак, они могут быть простыми компонентами, такими как промежуточное ПО для аутентификации, или интерфейсами для связи с целыми фреймворками, такими как WebAPI?


person user1620696    schedule 20.05.2014    source источник
comment
Для тех, кто еще не в курсе, доступен исходный код Katana, поэтому вы можете подробно увидеть, как работают различные модули здесь. Например, если вы посмотрите на класс Microsoft.Owin.Security.Cookies.CookieAuthenticationExtensions, вы увидите, как используются методы расширения, позволяющие вам регистрировать модули промежуточного программного обеспечения с вашим IAppBuilder.   -  person Tom Tregenna    schedule 04.09.2014


Ответы (2)


Промежуточное программное обеспечение так же просто, как думать о композиции математических функций. (почти) заданная подпись OWIN – это Func<AppFunc, AppFunc>, где using AppFunc = Func<IDictionary<string, object>, Task>.

Если вы думаете с точки зрения композиции функций, цель становится ясной:

val f : int -> int
let f x = x*x

val g : int -> int
let g x = x+x

Вы можете вызвать их вручную:

val result1 : int -> int
let result1 x = g(f(x))

Или вы можете составить функции для создания новой функции:

val result1 : int -> int
let newFunc = g • f
// or in F#
let newFunc = g << f

Вернемся к OWIN, снова используя нотацию F# для простоты:

type AppFunc = IDictionary<string, obj> -> Task
val app : AppFunc
val middleware : AppFunc -> AppFunc

Применение моего app к middleware создает новый app':

let app' : AppFunc = middleware app

Конкретным примером является ПО промежуточного слоя ведения журнала. Следуя композиции, вы обнаружите, что запрос выглядит следующим образом:

request -> loggingMiddleware -> app -> loggingMiddleware -> response

давая вам возможность регистрировать как входящий запрос, так и исходящий ответ. Фактически это то же самое, что и HttpMessageHandler веб-API.

Katana упрощает это для разработчиков C# благодаря IAppBuilder и расширению .Use, а также каждой библиотеке промежуточного программного обеспечения, предоставляющей метод быстрого расширения, такой как .UseWebApi или .UseSignalR.

Кроме того, Katana использует промежуточное ПО для монтирования фреймворков, чтобы можно было использовать сквозной механизм, основанный на коде состояния ответа 404, чтобы попытаться обработать запрос с другим фреймворком. Вы можете справиться с этим по-другому, просто монтируя фреймворки по разным путям, но этот механизм хорошо работает, если вы хотите обрабатывать разные части своего приложения по единому пути с использованием разных фреймворков.

person panesofglass    schedule 25.09.2014
comment
Тогда почему это не монада? Это определенно сделало бы LINQ to OWIN немного проще. ;) - person Dave Sexton; 26.09.2014
comment
@DaveSexton См. github.com/fsprojects/dyfrig /blob/master/src/Dyfrig/ :) - person panesofglass; 30.09.2014
comment
Хорошо, спасибо. Готова ли команда ASP.NET определить интерфейсы Katana как монады? - person Dave Sexton; 30.09.2014
comment
@DaveSexton Я очень сомневаюсь в этом, хотя не помешает то, что его можно легко обернуть с помощью линз. :) - person panesofglass; 03.10.2014

Если вы знакомы с жизненным циклом приложения ASP.NET и конвейером его обработки,

http://www.iis.net/learn/application-frameworks/building-and-running-aspnet-applications/how-to-use-advantage-of-the-iis-integrated-pipeline

Вы, вероятно, получили некоторые базовые представления о том, что такое промежуточное программное обеспечение. Сам конвейер (в основном типы в System.Web) представляет собой промежуточное программное обеспечение, которое соединяет ваши приложения ASP.NET (WebForms, MVC) с базовым хостом (веб-серверами, такими как IIS, IIS Express, Cassini, selfhost и т. д.).

Однако классический System.Web сильно связан, а затем идут OWIN и Katana. Если вы погрузитесь в кодовую базу Katana, вы увидите, что это конвейер. Он гораздо более гибкий и настраиваемый, поэтому говорить о нем как о промежуточном программном обеспечении теперь проще, чем когда-либо.

ASP.NET vNext полностью избавляется от System.Web, так что вы можете увидеть, какую важную роль Katana будет играть в ближайшие несколько месяцев.

person Lex Li    schedule 20.05.2014
comment
В чем разница между Katana и vNext? - person pinopino; 16.09.2014
comment
@MichałDudak все еще немного сбит с толку. оба в основном делают одно и то же (защищают OWIN). это полностью перегружено для разработчиков .net, я имею в виду, что теперь у нас есть два разных технологических стека для изучения, верно? - person pinopino; 17.09.2014
comment
Katana существует уже несколько месяцев и нацелена на то, чтобы стать реализацией Microsoft OWIN. Но обратите внимание, что ASP.NET vNext — это более амбициозный план, чем когда-либо, поэтому никто не может сказать, сможет ли Katana удовлетворить потребности. Основываясь на текущем наблюдении за кодом, мы можем только сказать, что ASP.NET vNext по некоторым причинам напрямую не использует Katana, но мы не можем предсказать будущее. Не исключено, что наконец-то какие-то изменения идут в Katana, или они только в vNext. Я стараюсь не делать никаких выводов в данный момент. - person Lex Li; 17.09.2014