15

如果我使用 Microsoft.Owin 类型(如 OwinMiddleware 和 IOwinContext)构建 OWIN 中间件,我的中间件是否可以与非 Microsoft Owin 主机/服务器一起使用?我正在查看NancySignalR的中间件类,它们似乎与 Cookie 身份验证中间件和WebApi等中间件所基于的OwinMiddleware基类非常不同。我正在阅读规范,但我仍然不清楚非 Microsoft Owin 服务器是否可以在不依赖 Microsoft.Owin 的情况下使用 OwinMiddleware 和 IOwinContext 类型(我猜这会破坏 Owin 的目的)。

4

1 回答 1

18

如果您使用 OwinMiddleware 基本类型构建中间件,默认情况下它不适用于非 Microsoft Owin 服务器。但它可以与非微软服务器一起工作(以 Nowin 为例,SignalR 工作得很好)。

IAppBuilder 的默认实现(https://github.com/owin/owin-hosting/blob/master/src/main/Owin.Builder/AppBuilder.cs)具有内置的签名转换功能。这允许任何人注册一个从 T -> AppFunc 和 AppFunc -> T 转换。这意味着您可以在同一管道中混合和匹配具有不同签名的中间件。(有关 OwinMiddleware 工作原理的示例,请参阅https://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin/Infrastructure/SignatureConversions.cs )。只要存在这种转换,您就可以使“原始”中间件(如 nancy)与 OwinMiddleware 无缝协作。要查看它是如何工作的,请看这里:

https://github.com/owin/owin-hosting/blob/master/src/main/Owin.Builder/AppBuilder.cs#L182(现在你的大脑爆炸了......继续阅读)

对于 SignalR,我们会自动代表您添加转换(https://github.com/SignalR/SignalR/blob/dev/src/Microsoft.AspNet.SignalR.Core/Owin/OwinExtensions.cs#L168),但它可以在任何依赖于 OwinMiddleware 的代码中完成,以确保转换有效。

如果您使用任何 Microsoft.Owin.Hosting 来引导您的应用程序,但您使用的是非 Microsoft Web 服务器,您也将免费获得转换(请参阅 nowin 自述文件以获取示例https://github.com/ Bobris/Nowin/blob/master/README.md)。

希望这可以帮助。

于 2013-10-27T00:53:18.703 回答