【问题标题】:Are Microsoft.Owin types like OwinMiddleware and IOwinContext incompatible with other Owin servers?像 OwinMiddleware 和 IOwinContext 这样的 Microsoft.Owin 类型是否与其他 Owin 服务器不兼容?
【发布时间】:2013-10-27 00:01:00
【问题描述】:

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

【问题讨论】:

    标签: signalr asp.net-web-api owin katana


    【解决方案1】:

    如果您使用 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)。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的精彩回答和链接!这正是我需要的详细程度才能对我有意义。只希望每个人都坚持单一的方法签名,而不是做所有这些飞行忍者,超级人类的编码壮举,从一个签名转换为另一个。编码已经够难了
    • OwinMiddleware 是非常不必要的。它对可发现性有所帮助,并为您提供了一些强类型,但如果您仅将 MS.Owin 用于 OwinContext 并手动实现 AppFunc,您几乎可以获得相同的好处。
    • 我最近创建了一个关于此的问题:katanaproject.codeplex.com/workitem/81
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2015-10-03
    相关资源
    最近更新 更多