细说ASP.NET Core与OWIN的关系
前言
最近這段時間除了工作,所有的時間都是在移植我以前實現的一個Owin框架,相當移植到到Core的話肯定會有很多坑,這個大家都懂,以后幾篇文章可能會圍繞這個說下,暫時就叫《Dotnet Core踩坑記》吧,呵呵。
接下來我對我在移植過程中發現的一些問題進行了總結,今天主要說說Owin。說到Owin就不能不提Katana項目和宇內大神的Tinyfox了,當然關于這兩塊內容這篇文章就不多涉及了,博友可以自己在博客園內搜索關于Owin的文章還是挺多的。
Owin
ASP.NET vNext剛推出的時候,號稱是Owin的一個實現,在?http://owin.org?上,直到現在還保留著這樣一段描述。
Implementations
Katana
Freya
ASP.NET vNext
很多開發者紛紛實現著自己的Owin框架,也寫很多應用到了實際的生產環境中,當然我也是其中一員。
ASP.NET Core
移植過程中,會發現有很多的不同,還有遇到新的API不知道怎么使用,這時候看文檔還不如直接看源碼來的痛快。
在看完AspCore.Mvc后才發現,一點關于Owin的內容都沒有;但很明顯官方文檔上說是支持Owin協議的,后來我硬著頭皮去看了看KestrelHttpServer和HttpAbstractions兩個項目,后來才發現原來真的沒有一點點的Owin協議內容啊(一定要給MS差評)。
好吧,只能看看MS是怎么支持Owin的,在HttpAbstractions項目里發現了Microsoft.AspNetCore.Owin這樣一個子項目,看完只是想說:“你這意思這叫向下兼容?” ,算了。 現在只要在Asp.net core項目里加入依賴Microsoft.AspNet.Owin就可以IApplicationBuilder接口的擴展方法UseOwin進行Owin中間件的調用。如下:
添加依賴:
"dependencies": { ? ?"Microsoft.AspNet.Server.Kestrel": "1.0.0-*", ? ?"Microsoft.AspNet.Owin": "1.0.0-*" ?},在Startup中加入UseOwin:?
public void Configure(IApplicationBuilder app){
? ? ?app.UseOwin(pipeline =>
? ? ?{ ? ? ? ? pipeline(next => OwinHello);
? ? ?});
}
當然OwinHello的內容一定是一個標準Owin中間件的內容了:
Kestrel
既然新的服務器已經不在支持Owin協議了,那個是怎么通信的?
這個問題在ASP.NET Core管道深度剖析系列文章中被提到過一些,其實每一個HttpContext在被創建出來都會依賴一個IFeatureCollection集合。
IFeatureCollection這個接口用于描述某個對象所具有的一組特征,由一組Feature接口組成。
列出其中一個IHttpConnectionFeature接口,用于獲得Http的連接信息:
閱讀kestrel源碼,發現每一次接受tcp連接,都會將Http流,封裝在一個幀Frame,它被描述成一個單向或雙向的request和response。 并組裝成特征集合供上層應用進行使用。
最后
最后就發一段Owin字典對應Feature的源碼吧:
只能說還好,性能并沒有太多的損耗,粘的不全,全的自己看吧 : )?
當然MS這樣做也是有用意義的,他們不太喜歡字典的方式,于是用Feature這種方式將這些內容,"強類型化了"。這對于底層的Server來說,很快能基于這組特征二次開發出一套中間件來支持ASP.NET Core,當然直接在Server內實現這樣性能也會更高。
只能說API變化有點快吧,但是對于開源,看幾天源碼就全明白了,這對于我們dotnet開發者來說,真是大大的好事兒。
原文地址:http://www.cnblogs.com/maxzhang1985/p/5553335.html
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的细说ASP.NET Core与OWIN的关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Consul入门
- 下一篇: 微软发布正式版SQL Server 20