OWIN中間件使用實例
我認為我自己是 OWIN 的初級初學者,在閱讀了大量文件後,我對相互矛盾的概念比開始之前更加困惑。我知道這些是多個問題,但我覺得回答這些問題將消除關於 OWIN 以及如何最好地使用它的最基本的疑問。以下是我的問題:
- 我可以使用 OWIN 中間件來完成我使用消息處理程序或 HTTP 模組無法做到的事情?或者除了後兩者與 IIS 緊密耦合之外,它們是同一件事嗎?
- 很多文件都說 OWIN 允許在 Web 伺服器和 Web 應用程序之間解耦,即。消除對託管 Web API 應用程序的 IIS 的依賴。但我還沒有看到使用 OWIN 並成功從託管在 IIS 和其他一些 Web 伺服器上移植的一些 Web 應用程序或 Web api 的範例。那麼 IIS 和自託管是實現 Web 伺服器和 Web 應用程序之間這種解耦的唯一方法嗎?
- 當我搜尋 OWIN 中間件範例時,我只找到了 Katana 和 Helios,它們是 OWIN 規範僅有的兩個實現。根據一些文章,Katana 幾乎已完成並且不會超出修訂版 3,並且 Microsoft 尚未支持 Helios。那麼在這種情況下,OWIN 的未來是什麼?
- 到目前為止,我看到的唯一詳細的實際用法是使用 OWIN 使用 OAuth 2 進行身份驗證。還有其他將 OWIN 實現保持在中間的用法嗎?
- 在我的啟動類的配置方法中,我嘗試連結簡單的中間件程式碼片段,如下所示,並且能夠看到正在發送的請求:-
但出現錯誤:
如何查看傳入的請求並為中間件中的下一個組件修改它?
- 您在 Web 伺服器和應用程序之間的項目中插入的各種中間件有哪些?
感謝您回答上述任何或所有問題。
我可以使用 OWIN 中間件來完成我使用消息處理程序或 HTTP 模組無法做到的事情?或者除了後兩者與 IIS 緊密耦合之外,它們是同一件事嗎?
與 IIS 解耦是其中的一部分。OWIN 中間件是一個管道,它允許某些“OWIN 感知”的事物參與到請求中,如果他們願意的話。IHttpHandler 只處理一件事——它們不是可連結的。我更喜歡將管道與 Global.asax 進行比較。我見過很多填充的 Global.asax 處理程序做各種各樣的事情,比如身份驗證、授權、吐出 HTTP 標頭(如 P3P 策略、X-Frame-Options 等)。其中的部分問題是從中開發可重用組件很難並且依賴於 IIS。OWIN 試圖消除這些問題。
很多文件都說 OWIN 允許在 Web 伺服器和 Web 應用程序之間解耦,即。消除對託管 Web API 應用程序的 IIS 的依賴。但我還沒有看到使用 OWIN 並成功從託管在 IIS 和其他一些 Web 伺服器上移植的一些 Web 應用程序或 Web api 的範例。那麼 IIS 和自託管是實現 Web 伺服器和 Web 應用程序之間這種解耦的唯一方法嗎?
這對於 WebAPI 2 和 SignalR 2 來說是正確的。MVC 5 和更早版本目前還不能真正與 IIS 分離。MVC 6 將解決這個問題,並且是一個相當大的改革。ASP.NET 網站有一兩個關於 SignalR 在控制台應用程序上自託管的教程。您將在教程中看到一個
Startup類,就像它在 IIS 或 IIS Express 上執行一樣。控制台應用程序唯一不同的是它在Main方法中使用 HttpListener 引導伺服器。$$ comment $$關於上面的第 2 點,這裡的 owin 組件是什麼?Katana 是一個 owin 組件,還是我們使用 Katana 編寫的程式碼,還是兩者結合在一起?
OWIN 實際上並不是 Web 應用程序和 Web 伺服器之間的一個抽象層,而是一個規範。根據您要在其上執行的伺服器,OWIN 有不同的“實現”——Katana 是執行 WebAPI 2 和 SignalR 2 的 OWIN 實現。Kestrel 是 OWIN 實現的另一個範例。
當我搜尋 OWIN 中間件範例時,我只找到了 Katana 和 Helios,它們是 OWIN 規範僅有的兩個實現。根據一些文章,Katana 幾乎已完成並且不會超出修訂版 3,並且 Microsoft 尚未支持 Helios。那麼在這種情況下,OWIN 的未來是什麼?
這仍然有點懸而未決,但 OWIN 正被用於開發允許 ASP.NET 5 Core 在 Linux / OS X 上執行的 Kestrel Web 伺服器。
到目前為止,我看到的唯一詳細的實際用法是使用 OWIN 使用 OAuth 2 進行身份驗證。還有其他將 OWIN 實現保持在中間的用法嗎?
SignalR 和 WebAPI 也使用 OWIN。這很有用,因此您可以將 SignalR Hub 作為 Windows 服務執行,Web API 也是如此。
將 OWIN 實現保持在中間的任何其他此類用法?
平台獨立性。將 OWIN 放在中間意味著我可以將我的 MVC 6 核心 Web 應用程序從在 IIS 上執行的 xcopy 複製到我的 Mac 上的 Kestrel,而 OWIN 實現會負責其餘的工作。
在我的啟動類的配置方法中,我嘗試如下連結簡單的中間件程式碼片段,並能夠看到正在發送的請求。
context.RequestOWIN 中沒有索引器。改用Get<>:app.Use(async (context, next) => { context.Response.Write("hello world 2: " + context.Request.Get<object>("owin.RequestBody")); await next(); });請注意,這
owin.RequestBody是一個實現細節,實際返回類型是內部的。我不確定你想要得到什麼,如果你想要一個查詢字元串,Query從請求中使用,或者Headers你想要一個 HTTP 標頭。您在 Web 伺服器和應用程序之間的項目中插入的各種中間件有哪些?
處理安全的事情,比如處理內容安全策略中的 nonce 的中間件組件,我在我的個人部落格here上寫過。它的要點是它允許我添加一個帶有 nonce 的 HTTP 標頭:
public void Configuration(IAppBuilder app) { app.Use((context, next) => { var rng = new RNGCryptoServiceProvider(); var nonceBytes = new byte[16]; rng.GetBytes(nonceBytes); var nonce = Convert.ToBase64String(nonceBytes); context.Set("ScriptNonce", nonce); context.Response.Headers.Add("Content-Security-Policy", new[] {string.Format("script-src 'self' 'nonce-{0}'", nonce)}); return next(); }); //Other configuration... }從那裡,在我的 Razor 視圖中,我可以將 nonce 添加到
<script>元素中,以便從 owin 上下文中獲取令牌。它還有很多其他用途。其他框架現在可以輕鬆地將自己注入到請求/響應過程中。NancyFx框架現在可以使用 OWIN。

