ASP.NET 發(fā)展歷程ASP.NET Web FormASP.NET Web Form 在2002正式發(fā)布時(shí),面向的開發(fā)者主要有兩類:
為了迎合這兩類開發(fā)者,ASP.NET Web Form通過(guò)使用沉重的ViewState來(lái)保存頁(yè)面回傳過(guò)程中的狀態(tài)值,因?yàn)?/SPAN>HTTP協(xié)議是無(wú)狀態(tài)的,通過(guò)ViewState,使原本沒(méi)有記憶的Http協(xié)議變得有記憶起來(lái)。這在當(dāng)時(shí)是非常好的設(shè)計(jì),能通過(guò)拖拽控件的形式快速開發(fā)Web,而不必過(guò)多的去關(guān)注底層原理。同時(shí)ASP.NET團(tuán)隊(duì)還為ASP.NET豐富了更多的功能、諸如:Session、Cache、Configuration等等。 這在當(dāng)時(shí)無(wú)疑是成功的,ASP.NET的發(fā)布迅速拉攏了開發(fā)者,在Web開發(fā)中形成了一股新的勢(shì)力,但同時(shí)也買下來(lái)一些隱患:
ASP.NET MVC由于Web Form產(chǎn)生一大堆ViewState和客戶端腳本,這對(duì)開發(fā)者來(lái)說(shuō)慢慢變成一種累贅,因?yàn)槲覀冎幌氘a(chǎn)生純凈的HTML標(biāo)記。所以開發(fā)者更想去主動(dòng)控制而非被動(dòng)產(chǎn)生額外HTML標(biāo)記。 所以微軟基于MVC設(shè)計(jì)模式推出了其重要的Web Framework——ASP.NET MVC Framework,通過(guò)Model-View-Control解耦了業(yè)務(wù)邏輯和表現(xiàn)邏輯,同時(shí)沒(méi)有了服務(wù)器端控件,將頁(yè)面的控制權(quán)完全交給了開發(fā)者。 為了快速更新迭代,通過(guò)Nuget來(lái)獲取更新,故從.NET Framework中分離開了。 但唯一不足的是,ASP.NET MVC還是基于ASP.NET Framework(注:ASP.NET MVC 6已經(jīng)不依賴System.Web),所以Web Application和Web Server依舊沒(méi)有解耦。 ASP.NET Web API隨著時(shí)間的推移,一些問(wèn)題開始暴露出來(lái)了,由于Web Server和Web Application緊耦合在一起,微軟在開發(fā)獨(dú)立、簡(jiǎn)單的Framework上越發(fā)捉襟見肘,這和其他平臺(tái)下開源社區(qū)蓬勃發(fā)展形成鮮明對(duì)比,幸運(yùn)的是,微軟做出了改變,推出了獨(dú)立的Web Framework ——ASP.NET Web API,他適用于移動(dòng)互聯(lián)網(wǎng)并可以快速通過(guò)Nuget安裝,更為重要的是,他不依賴System.Web,也不依賴IIS,你可以Self-Host或者在其他Web Server部署。 Katana隨著Web API能夠運(yùn)行在自己的輕量級(jí)的宿主中,并且越來(lái)越多簡(jiǎn)單、模塊化、專一的Framework問(wèn)世,開發(fā)人員有時(shí)候不得不啟動(dòng)單獨(dú)的進(jìn)程來(lái)處理Web應(yīng)用程序的各種組件(模塊)、如靜態(tài)文件、動(dòng)態(tài)文件、Web API和Socket。為了避免進(jìn)程擴(kuò)散,所有的進(jìn)程必須啟動(dòng)、停止并且獨(dú)立進(jìn)行管理。這時(shí),我們需要一個(gè)公共的宿主進(jìn)程來(lái)管理這些模塊。 這就是OWIN誕生的原因,解耦成最小粒度的組件,然后這些標(biāo)準(zhǔn)化框架和組件可以很容易地插入到OWIN Pipeline中,從而對(duì)組件進(jìn)行統(tǒng)一管理。而Katana正是OWIN的實(shí)現(xiàn),為我們提供了豐富的Host和Server。 走進(jìn)Katana的世界Katana作為OWIN的規(guī)范實(shí)現(xiàn),除了實(shí)現(xiàn)Host和Server之外,還提供了一系列的API幫助開發(fā)應(yīng)用程序,其中已經(jīng)包括一些功能組件如身份驗(yàn)證(Authentication)、診斷(Diagnostics)、靜態(tài)文件處理(Static Files)、ASP.NET Web API和SignalR的綁定等。 Katana的基本原則
Katana 體系結(jié)構(gòu)Katana實(shí)現(xiàn)了OWIN的Layers,所以Katana的體系結(jié)構(gòu)和OWIN一致,如下所示:
1.)Host :宿主Host被OWIN規(guī)范定義在第一層(最底層),他的職責(zé)是管理底層的進(jìn)程(啟動(dòng)、關(guān)閉)、初始化OWIN Pipeline、選擇Server運(yùn)行等。 Katana為我們提供了3中選擇:
2.)Server Host之后的Layer被稱為Server,他負(fù)責(zé)打開套接字并監(jiān)聽Http請(qǐng)求,一旦請(qǐng)求到達(dá),根據(jù)Http請(qǐng)求來(lái)構(gòu)建符合OWIN規(guī)范的Environment Dictionary(環(huán)境字典)并將它發(fā)送到Pipeline中交由Middleware處理。Katana對(duì)OWIN Server的實(shí)現(xiàn)分為如下幾類:
3)Middleware Middleware(中間件)位于Host、Server之后,用來(lái)處理Pipeline中的請(qǐng)求,Middleware可以理解為實(shí)現(xiàn)了OWIN應(yīng)用程序委托AppFun的組件。 Middleware處理請(qǐng)求之后并可以交由下一個(gè)Pipeline中的Middleware組件處理,即鏈?zhǔn)教幚碚?qǐng)求,通過(guò)環(huán)境字典可以獲取到所有的Http請(qǐng)求數(shù)據(jù)和自定義數(shù)據(jù)。Middleware可以是簡(jiǎn)單的Log組件,亦可以為復(fù)雜的大型Web Framework,諸如:ASP.NET Web API、Nancy、SignlR等,如下圖所示:Pipeline中的Middleware用來(lái)處理請(qǐng)求:
4.)Application 最后一層即為Application,是具體的代碼實(shí)現(xiàn),比如ASP.NET Web API、SignalR具體代碼的實(shí)現(xiàn)。 現(xiàn)在,我想你應(yīng)該了解了什么事Katana以及Katana的基本原則和體系結(jié)構(gòu),那么現(xiàn)在就是具體應(yīng)用到實(shí)際當(dāng)中去了。 使用ASP.NET/IIS托管Katana-based應(yīng)用程序
在Startup的Configuration方法中實(shí)現(xiàn)OWIN Pipeline處理邏輯,如下代碼所示:
app.Run方法將一個(gè)接受IOwinContext對(duì)象最為輸入?yún)?shù)并返回Task的Lambda表達(dá)式作為OWIN Pipeline的最后處理步驟,IOwinContext強(qiáng)類型對(duì)象是對(duì)Environment Dictionary的封裝,然后異步輸出"Hello World"字符串。 細(xì)心的你可能觀察到,在Nuget安裝Microsoft.Owin.Host.SystemWeb程序集時(shí),默認(rèn)安裝了依賴項(xiàng)Microsoft.Owin程序集,正式它為我們提供了擴(kuò)展方法Run和IOwinContext接口,當(dāng)然我們也可以使用最原始的方式來(lái)輸出"Hello World"字符串,即Owin程序集為我們提供的最原始方式,這僅僅是學(xué)習(xí)上參考,雖然我們不會(huì)在正式場(chǎng)景下使用:
使用自定義Host(self-host)托管Katana-based應(yīng)用程序使用自定義Host托管Katana應(yīng)用程序與使用IIS托管差別不大,你可以使用控制臺(tái)、WinForm、WPF等實(shí)現(xiàn)托管,但要記住,這會(huì)失去IIS帶有的一些功能(SSL、Event Log、Diagnostics、Management…),當(dāng)然這可以自己來(lái)實(shí)現(xiàn)。
使用自定義的Host將失去IIS的一些功能,當(dāng)然我們可以自己去實(shí)現(xiàn)。幸運(yùn)的是,Katana為我們默認(rèn)實(shí)現(xiàn)了部分功能,比如Diagnostic,包含在程序集Microsoft.Owin.Diagnostic中。
在上述代碼中,當(dāng)請(qǐng)求的路徑(Request.Path)為根目錄時(shí),渲染輸出Webcome Page并且不繼續(xù)執(zhí)行Pipeline中的其余Middleware組件,如下所示:
如果請(qǐng)求的路徑為Error時(shí),拋出異常,顯示錯(cuò)誤頁(yè),如下所示:
使用OwinHost.exe托管Katana-based應(yīng)用程序當(dāng)然我們還可以使用Katana提供的OwinHost.exe來(lái)托管應(yīng)用程序,毫無(wú)疑問(wèn),通過(guò)Nuget來(lái)安裝OwinHost。 如果你按照我的例子一步一步執(zhí)行的話,你會(huì)發(fā)現(xiàn)不管使用ASP.NET/IIS托管還是自托管,Startup配置類都是不變的,改變的僅僅是托管方式。同理OwinHost也是一樣的,但它更靈活,我們可以使用類庫(kù)或者Web應(yīng)用程序來(lái)作為Application。
類庫(kù)作為Application,可以最小的去引用程序集,創(chuàng)建一個(gè)類庫(kù)后,刪除默認(rèn)的Class1.cs,然后并且添加Startup啟動(dòng)項(xiàng),這會(huì)默認(rèn)像類庫(kù)中添加Owin和Microsoft.Owin程序集的引用。 然后,使用Nuget來(lái)安裝OwinHost.exe,如Install-Package OwinHost,注意它并不是一個(gè)程序集,而是.exe應(yīng)用程序位于<solution root>/packages/OwinHost.(version)/tools文件夾。 因?yàn)轭悗?kù)不能直接運(yùn)行,那么只能在它的根目錄調(diào)用OwinHost.exe來(lái)托管,它將加載.\bin文件下所有的程序集,所以需要改變類庫(kù)的默認(rèn)輸出,如下所示:
然后編譯解決方案,打開cmd,鍵入如下命令:
如上圖成功啟動(dòng)了宿主Host并且默認(rèn)監(jiān)聽5000端口。 OwinHost.exe還提供自定義參數(shù),通過(guò)追加-h來(lái)查看,如下所示:
既然類庫(kù)不能直接運(yùn)行,當(dāng)然你也不能直接進(jìn)行調(diào)試,我們可以附加OwinHost進(jìn)程來(lái)進(jìn)行調(diào)試,如下所示:
報(bào)錯(cuò)信息如下:
Web Application比類庫(kù)使用起來(lái)輕松多了,你可以直接運(yùn)行和調(diào)試,唯一比較弱的可能是它引用較多的程序集,你完全可以刪掉,比如System.Web。 通過(guò)Nuget安裝了OwinHost.exe之后,可以在Web中使用它,如下所示:
幾種指定啟動(dòng)項(xiàng)Startup的方法
小結(jié)
本博客為木宛城主原創(chuàng),基于Creative Commons Attribution 2.5 China Mainland License發(fā)布,歡迎轉(zhuǎn)載,演繹或用于商業(yè)目的,但是必須保留本文的署名木宛城主(包含鏈接)。如您有任何疑問(wèn)或者授權(quán)方面的協(xié)商,請(qǐng)給我留言。 |
|
|
來(lái)自: 昵稱10504424 > 《工作》