2015-06-03 123 views
17

我只是想讓我的頭腦圍繞webapi,webhost(iis)和owin之間的關係。我會寫下我目前的理解,並且請你告訴我它是否正確。Webapi,Webhost和Owin之間的關係

  • Webapi,與MVC不同,它是以獨立於主機的方式編寫的。這是在歐文前幾天,但顯然他們預計歐文遲早會發生。主機獨立性主要意味着System.Web不會在Webapi代碼中的任何地方使用。它是System.Web完全依賴於IIS,沒有它就無法工作。這樣Webapi可以在任何地方理論上託管 - 一旦其他主機可用。
  • 虛擬主機Microsoft.Owin.Host.SystemWeb,Microsoft.AspNet.WebApi.WebHost)是更高級別的API(如Webapi)和IIS之間的一個層。由於Webapi最初是獨立於主機的,因此需要使其在特定主機(例如IIS)上運行的中間層。 Webapi的Webhost(Microsoft.AspNet.WebApi.WebHost)提供了這一層。稍後還會有Owin的Webhost層(Microsoft.Owin.Host.SystemWeb),這將允許在IIS上託管Owin兼容任何東西。
  • 歐文來到了最後。它基本上提供了一個抽象,理論上允許在任何主機上託管任何與Owin兼容的應用程序,只要owin和該主機之間存在一層即可。 Owin與Webhost(Microsoft.Owin.Host.SystemWeb)一起(類似於Webapi與Webhost一起提供)允許Owin應用程序託管在IIS上。它還附帶了自主主機(Microsoft.Owin.SelfHost),允許Owin應用程序託管在任何可執行文件中。就Webapi而言,Owin還與Owin的Webapi主機(Microsoft.AspNet.WebApi.Owin)一起出現,允許在Owin堆棧上運行WebApi。

以上所有意思是說有一種方法可以在IIS上託管Webapi。它可以在沒有Owin的情況下使用Webapi WebHost來完成,或者可以使用Owin Host for Webapi和使用Owin的Webhost來完成。

的NuGet引用:

這是理解是否正確?

+0

這種理解是否正確?是。 – Andrei

回答

12

你的理解一般是正確的,但OWIN的作用似乎被誤解了。更完整的時間表是:

  1. OWIN Standard用來描述通用.NET Web界面,一拉WSGI /耙/連接(first commit in 2010)。
  2. ASP.NET WebAPI是獨立於主機開發的,但是與https://www.nuget.org/packages/Microsoft.AspNet.WebApi.WebHost/一起發佈。
  3. 卡塔納項目實現了幾個OWIN主機:
    1. https://www.nuget.org/packages/Microsoft.Owin.SelfHost/
    2. https://www.nuget.org/packages/Microsoft.Owin.Host.HttpListener/
    3. https://www.nuget.org/packages/Microsoft.Owin.Host.IIS/
    4. https://www.nuget.org/packages/Microsoft.Owin.Host.SystemWeb/
  4. ASP.NET的WebAPI適配器OWIN發佈:https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Owin

你總結:

所有一個對IIS託管的WebAPI的兩種不同的方式在上述手段。它可以在沒有Owin的情況下使用Webapi WebHost來完成,或者可以使用Owin Host for Webapi和使用Owin的Webhost來完成。

我想重申,如:

上述所有意味着一個具有託管的WebAPI的兩種不同的方式。它可以在沒有Owin的情況下使用,使用WebAPI WebHost,或者可以使用OWIN adapter for WebAPI和任何OWIN兼容的主機完成。 IIS上的主機選項爲Microsoft.Owin.Host.IISMicrosoft.Owin.Host.SystemWeb。還提供了Microsoft.AspNet.WebApi.OwinSelfHost

+2

我要添加的唯一警告是它是*錯誤*嘗試和使用Microsoft.AspNet.WebApi.Owin在IIS中託管,即使大多數示例使用它 - 這只是爲自主機。請參閱http://stackoverflow.com/questions/33402654/web-api-with-owin-throws-objectdisposedexception-for-httpmessageinvoker以及Katana項目的基本答案http://aspnetwebstack.codeplex.com/workitem/2091 –

+1

@PaulHatcher自您發表評論以來,在CodePlex上的討論中發表了另一篇文章。它指向了Katana團隊成員指示使用Microsoft.AspNet.WebApi.Owin的不同討論,因此無論是ASP.NET團隊成員是否誤導,它*都*工作,或者他是對的,但它工作得很好。 *(另外,我並不是OWIN的專家,但是我沒有道理說「這個OWIN包僅用於這個特定的OWIN主機」。)* – Stijn

+1

@Stijn我有很多穩定性問題的規模,直到我刪除WebApi.Owin,也討論是關於修改標題,但這個對話http://katanaproject.codeplex.com/discussions/540202這是源提到其他問題與去這條路線,如不支持WebAPI屬性路由 - 與沒有經典的建議有點混淆 –

相關問題