OWIN和Katana - 中间件究竟是什么?

use*_*696 3 asp.net owin katana

与Katana项目合作时,我们经常处理中间件.在ASP.NET网站上他们说

如前所述,当服务器接受来自客户端的请求时,它负责将其传递给OWIN组件管道,这些组件由开发人员的启动代码指定.这些管道组件称为中间件.

那没关系,但我完全不明白.起初我认为中间件是ASP.NET组件,如WebAPI,SignalR和所有这些.但是,在学习身份验证时,我看到了Cookie身份验证中间件.这个不是像WebAPI这样的整个框架,因此它不适合我最初的中间件概念.

那么Katana中间件到底是什么?它们只是可以集成在执行管道上并在环境字典上工作的代码片段?因此,它们可以是简单的组件,如身份验证中间件或与WebAPI等整个框架进行通信的接口?

pan*_*ass 6

中间件就像思考数学函数组合一样简单.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
Run Code Online (Sandbox Code Playgroud)

你可以手动调用它们:

val result1 : int -> int
let result1 x = g(f(x))
Run Code Online (Sandbox Code Playgroud)

或者您可以编写函数来创建新函数:

val result1 : int -> int
let newFunc = g • f
// or in F#
let newFunc = g << f
Run Code Online (Sandbox Code Playgroud)

回到OWIN,再次使用F#表示法来保持简单:

type AppFunc = IDictionary<string, obj> -> Task
val app : AppFunc
val middleware : AppFunc -> AppFunc
Run Code Online (Sandbox Code Playgroud)

应用我appmiddleware创建一个新的app':

let app' : AppFunc = middleware app
Run Code Online (Sandbox Code Playgroud)

一个具体的例子是记录中间件.在组合之后,您会发现请求的流程如下:

request -> loggingMiddleware -> app -> loggingMiddleware -> response
Run Code Online (Sandbox Code Playgroud)

让您有机会记录传入请求和传出响应.这实际上与Web API相同HttpMessageHandler.

Katana使C#开发人员更容易通过IAppBuilder.Use扩展,以及每个中间件库暴露快捷方式扩展方法,如.UseWebApi.UseSignalR.

此外,Katana使用中间件来安装框架,以便它可以使用基于404响应状态代码的直通机制来尝试使用另一个框架处理请求.您可以通过在不同路径上安装框架来区别对待,但如果您希望使用不同的框架在统一路径下处理应用程序的不同部分,则此机制可以正常工作.

  • 那为什么不是monad呢?它肯定会使[LINQ to OWIN](https://linqtoowin.codeplex.com)更简单一些.;) (2认同)