asp.net - OWIN 和 Katana - 中间件到底是什么?

标签 asp.net owin katana

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

As previously mentioned, when the server accepts a request from a client, it is responsible for passing it through a pipeline of OWIN components, which are specified by the developer’s startup code. These pipeline components are known as middleware.

很好,但我不太明白。起初我以为中间件是 ASP.NET 组件,例如 WebAPI、SignalR 等等。然而,在研究身份验证时,我看到了 Cookie 身份验证中间件。这个不像 WebAPI 那样是一个完整的框架,所以它不符合我对中间件的最初想法。

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

最佳答案

中间件就像思考数学函数组合一样简单。欧文(nearly) spec'd signatureFunc<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

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

let app' : AppFunc = middleware app

一个具体的例子是日志记录中间件。顺着组合,你会发现请求流程是这样的:

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

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

Katana 通过 IAppBuilder 让 C# 开发人员的工作变得更简单和 .Use扩展,以及每个公开快捷扩展方法的中间件库,例如 .UseWebApi.UseSignalR .

此外,Katana 使用中间件来挂载框架,以便它可以使用基于 404 响应状态代码的失败机制来尝试使用另一个框架处理请求。您可以通过 mounting frameworks at different paths 以不同的方式处理这个问题,但是如果您想使用不同的框架在统一路径下处理应用程序的不同部分,则此机制非常有效。

关于asp.net - OWIN 和 Katana - 中间件到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23758505/

相关文章:

asp.net - Application_EndRequest 的 OWIN 等价物是什么?

c# - 如何在用户未登录的情况下保护授权网站?

owin - OWIN 安全 AuthenticationHandler 中的多个 cookie 问题

c# - 将 Gridview LinkBut​​ton ID 传递给 ASP.NET 中的模式弹出窗口

c# - "Length cannot be less than zero."在空行

c# - Controller.User 由 ASP.NET MVC 5 上的 ASP.NET Identity 设置不一致

asp.net - AuthenticationProperties.RedirectUri 未在 Challenge() 中传递给 Google

c# - 带有 Html.EditorFor 的表格

javascript - 代码可以在 IE 中运行,但不能在 FF 中运行