如果我使用像OwinMiddleware和IOwinContext这样的Microsoft.Owin类型构建OWIN中间件,我的中间件是否可以与非Microsoft Owin主机/服务器一起使用?我正在查看Nancy和SignalR的中间件类,它们看起来与OwinMiddleware基类非常不同,像Cookie身份验证中间件和WebApi这样的中间件基于。我正在阅读规范,但我仍然不清楚非Microsoft Owin服务器是否可以使用OwinMiddleware和IOwinContext类型而不依赖于Microsoft.Owin(我猜这会破坏Owin的目的)。
答案 0 :(得分:18)
如果使用OwinMiddleware基类型构建中间件,则默认情况下它不适用于非Microsoft Owin服务器。但它可以与非Microsoft服务器一起使用(SignalR与Nowin一起工作正常)。
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 )。
希望这有帮助。