与Katana Project合作时,我们经常处理中间件。在ASP.NET网站上,他们说
如前所述,当服务器接受来自的请求时 客户端,它负责通过OWIN管道传递它 组件,由开发人员的启动代码指定。这些 管道组件称为中间件。
那很好,但我不明白。起初我认为中间件是ASP.NET组件,如WebAPI,SignalR和所有这些。但是,在学习身份验证时,我看到了Cookie身份验证中间件。这个不是像WebAPI这样的整个框架,因此它不适合我最初的中间件概念。
那么Katana中间件到底是什么?它们只是可以集成在执行管道上并在环境字典上工作的代码片段?因此,它们可以是简单的组件,如身份验证中间件或与WebAPI等整个框架进行通信的接口?
答案 0 :(得分:6)
中间件就像思考数学函数组合一样简单。 OWIN (nearly) spec'd signature为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
让您有机会记录传入请求和传出响应。这实际上与Web API的HttpMessageHandler
相同。
Katana通过IAppBuilder
和.Use
扩展程序为C#开发人员提供了更简单的功能,以及每个中间件库都公开了一种快捷方式扩展方法,例如.UseWebApi
或.UseSignalR
此外,Katana使用中间件来安装框架,以便它可以使用基于404响应状态代码的直通机制来尝试使用另一个框架处理请求。您可以通过mounting frameworks at different paths以不同方式处理此问题,但如果您希望使用不同的框架在统一路径下处理应用程序的不同部分,则此机制可以正常工作。
答案 1 :(得分:2)
如果您熟悉ASP.NET应用程序生命周期及其处理管道,
您可能会对中间件是什么有一些基本的想法。管道本身(主要是System.Web中的类型)是一个中间件,它将ASP.NET应用程序(WebForms,MVC)桥接到底层主机(Web服务器,如IIS,IIS Express,Cassini,selfhost等)。
然而,经典的System.Web是高度耦合的,然后是OWIN和Katana。如果你深入了解Katana的代码库,你会发现自己是一个管道。它更加灵活,可高度自定义,因此将其称为中间件现在比以往更加简洁。
ASP.NET vNext完全摆脱了System.Web,因此您可以看到Katana在未来几个月中扮演重要角色。