Webapi、Webhost和Owin的关系

Posted

技术标签:

【中文标题】Webapi、Webhost和Owin的关系【英文标题】:Relationship between Webapi, Webhost and Owin 【发布时间】:2015-08-17 01:42:14 【问题描述】:

我只是想弄清楚 webapi、webhost (iis) 和 owin 之间的关系。我会写下我目前的理解,请你告诉我它是否正确。

Webapi,不像 MVC 是以独立于主机的方式编写的。这是在欧文之前的日子,但显然他们预计欧文迟早会发生。主机独立性主要是指 System.Web 在 Webapi 代码的任何地方都没有使用。 System.Web 完全依赖于 IIS,没有它就无法工作。这样,Webapi 理论上可以托管在任何地方——一旦其他主机可用。 WebhostMicrosoft.Owin.Host.SystemWebMicrosoft.AspNet.WebApi.WebHost)是更高级别的 API(如 Webapi)和 IIS 之间的一层。由于 Webapi 最初是独立于主机的,因此需要一个中间层才能使其在特定主机上运行,​​例如 IIS。 Webapi (Microsoft.AspNet.WebApi.WebHost) 的虚拟主机提供了这一层。稍后还将为 Owin (Microsoft.Owin.Host.SystemWeb) 提供 Webhost 层,这将允许在 IIS 上托管任何与 Owin 兼容的东西。 Owin 排在最后。它基本上提供了一种抽象,理论上允许在任何主机上托管任何与 Owin 兼容的应用程序,只要在 owin 和该主机之间存在一个层。 Owin 带有 Webhost (Microsoft.Owin.Host.SystemWeb)(类似于 Webapi 带有 Webhost),它允许 Owin 应用程序托管在 IIS 上。它还带有自托管 (Microsoft.Owin.SelfHost),允许 Owin 应用程序托管在任何可执行文件中。就 Webapi 而言,Owin 还附带了用于 Webapi 的 Owin 主机 (Microsoft.AspNet.WebApi.Owin),它允许在 Owin 堆栈上运行 WebApi。

以上所有意味着在 IIS 上托管 Webapi 有两种不同的方式。它可以在没有 Owin 的情况下使用 Webapi WebHost 完成,也可以使用 Webapi 的 Owin Host 和 Owin 的 Webhost 完成。

Nuget 参考:

Microsoft.Owin.SelfHost Microsoft.Owin.Host.SystemWeb Microsoft.AspNet.WebApi.WebHost Microsoft.AspNet.WebApi.Owin

这种理解正确吗?

【问题讨论】:

这种理解正确吗?是的。 “因为在 owin 和那个主机之间有一层。”你的意思是与 Owin 兼容的应用程序之间吧? 【参考方案1】:

您的理解大体上是正确的,但 OWIN 的作用似乎被误解了。更完整的时间表是:

    OWIN Standard 开发用于描述通用 .NET Web 界面,例如 WSGI/Rake/Connect (first commit in 2010)。 ASP.NET WebAPI 是独立于主机开发的,但与https://www.nuget.org/packages/Microsoft.AspNet.WebApi.WebHost/ 一起发布。 Katana 项目实现了几个 OWIN 主机:
      https://www.nuget.org/packages/Microsoft.Owin.SelfHost/ https://www.nuget.org/packages/Microsoft.Owin.Host.HttpListener/ https://www.nuget.org/packages/Microsoft.Owin.Host.IIS/ https://www.nuget.org/packages/Microsoft.Owin.Host.SystemWeb/
    用于 OWIN 的 ASP.NET WebAPI 适配器已发布:https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Owin。

你的总结:

以上所有意味着在 IIS 上托管 Webapi 有两种不同的方式。它可以在没有 Owin 的情况下使用 Webapi WebHost 完成,也可以使用 Webapi 的 Owin Host 和 Owin 的 Webhost 完成。

我会重申:

以上所有意味着一个人有两种不同的方式来托管 WebAPI。它可以在没有 Owin 的情况下使用 WebAPI WebHost 完成,也可以使用 OWIN adapter for WebAPI 和任何与 OWIN 兼容的主机完成。 IIS 上的托管选项为Microsoft.Owin.Host.IIS 和Microsoft.Owin.Host.SystemWeb。还提供了Microsoft.AspNet.WebApi.OwinSelfHost。

【讨论】:

我要补充的唯一警告是,使用 Microsoft.AspNet.WebApi.Owin 在 IIS 中尝试和托管是错误,即使大多数示例都使用它 - 这只是为自宿主。请参阅***.com/questions/33402654/… 和 Katana 项目的基本答案aspnetwebstack.codeplex.com/workitem/2091 @PaulHatcher 既然您发表了评论,那么在 CodePlex 的讨论中也发表了另一篇文章。它指向一个不同的讨论,其中 Katana 团队成员指示使用 Microsoft.AspNet.WebApi.Owin,因此该 ASP.NET 团队成员被误导并且它确实工作,或者他是对的但它工作得很好。 (另外,我不是 OWIN 专家,但说“此 OWIN 软件包仅用于此特定 OWIN 主机”对我来说毫无意义。) @Stijn 好吧,在我删除 WebApi.Owin 之前,我在规模上遇到了很多稳定性问题,讨论也是关于修改标题,但是这个对话 katanaproject.codeplex.com/discussions/540202 是源提到的其他问题这条路线,例如不支持 WebAPI 属性路由 - 与没有规范的建议有点混淆

以上是关于Webapi、Webhost和Owin的关系的主要内容,如果未能解决你的问题,请参考以下文章

使用OWIN 为WebAPI 宿主 跨平台

使用OWIN 为WebAPI 宿主 跨平台

带有 OWIN 的 webapi 中的复杂 JSON Web 令牌数组

Web API 2,OWIN 身份验证,SignOut 不注销

Web API 中的 OWIN CORS 问题

具有 OWIN 自主机和 Windows 身份验证的 Web Api