小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

ASP.NET MVC隨想錄——鋒利的KATANA

 昵稱10504424 2015-06-09
正如上篇文章所述那樣,OWINWeb ServerWeb Application之間定義了一套規(guī)范(Specs),意在解耦Web ServerWeb Application,從而推進(jìn)跨平臺(tái)的實(shí)現(xiàn)。若要真正使用OWIN規(guī)范,那么必須要對(duì)他們進(jìn)行實(shí)現(xiàn)。目前有兩個(gè)產(chǎn)品實(shí)現(xiàn)了OWIN規(guī)范——由微軟主導(dǎo)的Katana和第三方的Nowin。這篇文章,我主要關(guān)注還是Katana,由微軟團(tuán)隊(duì)主導(dǎo),開源到CodePlex上??梢栽?/SPAN>Visual Studio中輸入命令:git clone https://git01./katanaproject來(lái)查看源代碼。
在介紹Katana之前,我覺(jué)得有必要為大家梳理一下過(guò)去10幾年前ASP.NET 發(fā)展歷程。

ASP.NET 發(fā)展歷程

ASP.NET Web Form

ASP.NET Web Form 2002正式發(fā)布時(shí),面向的開發(fā)者主要有兩類:

  • 使用混合HTML標(biāo)記和服務(wù)端腳本開發(fā)動(dòng)態(tài)網(wǎng)站的ASP開發(fā)者,另外,ASP運(yùn)行時(shí)抽象了底層的HTTP連接和Web Server,并為開發(fā)者提供了一系列的對(duì)象模型用于交互Http請(qǐng)求,當(dāng)然也提供了額外的服務(wù)諸如SessionCache、State等。
  • 開發(fā)WinForm的程序員,他們可能對(duì)HTTPHTML一無(wú)所知,但熟悉拖控件的方式來(lái)構(gòu)建應(yīng)用程序。

為了迎合這兩類開發(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豐富了更多的功能、諸如:SessionCache、Configuration等等。

這在當(dāng)時(shí)無(wú)疑是成功的,ASP.NET的發(fā)布迅速拉攏了開發(fā)者,在Web開發(fā)中形成了一股新的勢(shì)力,但同時(shí)也買下來(lái)一些隱患:

  • 所有的功能、特性都發(fā)布在一個(gè)整體框架上并且緊耦合核心的Web抽象庫(kù)——System.Web
  • System.Web.NET Framework的重要組成部分,這意味著要修復(fù)更新System.Web必須更新.NET Framework,但.NET Framework是操作系統(tǒng)的基礎(chǔ),為了穩(wěn)定性往往不會(huì)頻繁更新。
  • ASP.NET Framework System.Web)緊耦合IIS
  • IIS只能運(yùn)行在Windows系統(tǒng)

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 ApplicationWeb Server依舊沒(méi)有解耦。

ASP.NET Web API

隨著時(shí)間的推移,一些問(wèn)題開始暴露出來(lái)了,由于Web ServerWeb 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 APISocket。為了避免進(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),為我們提供了豐富的HostServer。

走進(jìn)Katana的世界

Katana作為OWIN的規(guī)范實(shí)現(xiàn),除了實(shí)現(xiàn)HostServer之外,還提供了一系列的API幫助開發(fā)應(yīng)用程序,其中已經(jīng)包括一些功能組件如身份驗(yàn)證(Authentication)、診斷(Diagnostics)、靜態(tài)文件處理(Static Files)、ASP.NET Web APISignalR的綁定等。

Katana的基本原則

  • 可移植性:從HostàServeràMiddleware,每個(gè)Pipeline中的組件都是可替換的,并且第三方公司和開源項(xiàng)目的Framework都是可以在OWIN Server上運(yùn)行,也就是說(shuō)不受平臺(tái)限制,從而實(shí)現(xiàn)跨平臺(tái)。
  • 模塊化:每一個(gè)組件都必須保持足夠獨(dú)立性,通常只做一件事,以混合模塊的形式來(lái)滿足實(shí)際的開發(fā)需求
  • 輕量和高效:因?yàn)槊恳粋€(gè)組件都是模塊化開發(fā),而且可以輕松的在Pipeline中插拔組件,實(shí)現(xiàn)高效開發(fā)

Katana 體系結(jié)構(gòu)

Katana實(shí)現(xiàn)了OWINLayers,所以Katana的體系結(jié)構(gòu)和OWIN一致,如下所示:

1.Host :宿主HostOWIN規(guī)范定義在第一層(最底層),他的職責(zé)是管理底層的進(jìn)程(啟動(dòng)、關(guān)閉)、初始化OWIN Pipeline、選擇Server運(yùn)行等。

Katana為我們提供了3中選擇:

  • IIS / ASP.NET :使用IIS是最簡(jiǎn)單和向后兼容方式,在這種場(chǎng)景中OWIN Pipeline通過(guò)標(biāo)準(zhǔn)的HttpModuleHttpHandler啟動(dòng)。使用此Host你必須使用System.Web作為OWIN Server
  • Custom Host :如果你想要使用其他Server來(lái)替換掉System.Web,并且可以有更多的控制權(quán),那么你可以選擇創(chuàng)建一個(gè)自定義宿主,如使用Windows Service、控制臺(tái)應(yīng)用程序、Winform來(lái)承載Server
  • OwinHost :如果你對(duì)上面兩種Host還不滿意,那么最后一個(gè)選擇是使用Katana提供的OwinHost.exe:他是一個(gè)命令行應(yīng)用程序,運(yùn)行在項(xiàng)目的根部,啟動(dòng)HttpListener Server并找到基于約束的Startup啟動(dòng)項(xiàng)。OwinHost提供了命令行選項(xiàng)來(lái)自定義他的行為,比如:手動(dòng)指定Startup啟動(dòng)項(xiàng)或者使用其他Server(如果你不需要默認(rèn)的HttpListener Server)。

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)分為如下幾類:

  • System.Web:如前所述那樣,System.WebIIS/ASP.NET Host兩者彼此耦合,當(dāng)你選擇使用System.Web作為Server ,Katana System.Web Server把自己注冊(cè)為HttpModuleHttpServer并且處理發(fā)送給IIS的請(qǐng)求,最后將HttpRequest、HttpResponse對(duì)象映射為OWIN環(huán)境字典并將它發(fā)送至Pipeline中處理。
  • HttpListener:這是OwinHost.exe和自定義Host默認(rèn)的Server。
  • WebListener:這是ASP.NET vNext默認(rèn)的輕量級(jí)Server,他目前無(wú)法使用在Katana

3Middleware

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、NancySignlR等,如下圖所示: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)用程序

  • Visual Studio創(chuàng)建Web Application
  • Install-Package Microsoft.Owin.Host.SystemWeb
    • ASP.NET/IIS作為Host
    • System.Web作為Server
  • 添加Startup啟動(dòng)類

StartupConfiguration方法中實(shí)現(xiàn)OWIN Pipeline處理邏輯,如下代碼所示:

  1. public class Startup
  2. {
  3. public void Configuration(IAppBuilder app)
  4. {
  5. app.Run(context =>
  6. {
  7. context.Response.ContentType = "text/plain";
  8. return context.Response.WriteAsync("Hello World");
  9. });
  10. }
  11. }

app.Run方法將一個(gè)接受IOwinContext對(duì)象最為輸入?yún)?shù)并返回TaskLambda表達(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ò)展方法RunIOwinContext接口,當(dāng)然我們也可以使用最原始的方式來(lái)輸出"Hello World"字符串,即Owin程序集為我們提供的最原始方式,這僅僅是學(xué)習(xí)上參考,雖然我們不會(huì)在正式場(chǎng)景下使用:

  1. using AppFunc = Func<IDictionary<string, object>, Task>;
  2. public class Startup
  3. {
  4. public void Configuration(IAppBuilder app)
  5. {
  6. app.Use(new Func<AppFunc, AppFunc>(next => (env =>
  7. {
  8. string text = "Hello World";
  9. var response = env["owin.ResponseBody"] as Stream;
  10. var headers = env["owin.ResponseHeaders"] as IDictionary<string, string[]>;
  11. headers["Content-Type"] = new[] { "text/plain" };
  12. return response.WriteAsync(Encoding.UTF8.GetBytes(text), 0, text.Length);
  13. })));
  14. }
  15. }

使用自定義Host(self-host)托管Katana-based應(yīng)用程序

使用自定義Host托管Katana應(yīng)用程序與使用IIS托管差別不大,你可以使用控制臺(tái)、WinFormWPF等實(shí)現(xiàn)托管,但要記住,這會(huì)失去IIS帶有的一些功能(SSL、Event Log、DiagnosticsManagement…),當(dāng)然這可以自己來(lái)實(shí)現(xiàn)。

  • 創(chuàng)建控制臺(tái)應(yīng)用程序
  • Install-Package Microsoft.Owin.SelfHost
  • Main方法中使用Startup配置項(xiàng)構(gòu)建Pipeline并監(jiān)聽端口
  1. static void Main(string[] args)
  2. {
  3. using (WebApp.Start<Startup>("http://localhost:10002"))
  4. {
  5. System.Console.WriteLine("啟動(dòng)站點(diǎn):http://localhost:10002");
  6. System.Console.ReadLine();
  7. }
  8. }

使用自定義的Host將失去IIS的一些功能,當(dāng)然我們可以自己去實(shí)現(xiàn)。幸運(yùn)的是,Katana為我們默認(rèn)實(shí)現(xiàn)了部分功能,比如Diagnostic,包含在程序集Microsoft.Owin.Diagnostic中。

  1. public void Configuration(IAppBuilder app)
  2. {
  3. app.UseWelcomePage("/");
  4. app.UseErrorPage();
  5. app.Run(context =>
  6. {
  7. //將請(qǐng)求記錄在控制臺(tái)
  8. Trace.WriteLine(context.Request.Uri);
  9. //顯示錯(cuò)誤頁(yè)
  10. if (context.Request.Path.ToString().Equals("/error"))
  11. {
  12. throw new Exception("拋出異常");
  13. }
  14. context.Response.ContentType = "text/plain";
  15. return context.Response.WriteAsync("Hello World");
  16. });
  17. }

在上述代碼中,當(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ù)

類庫(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)試,如下所示:

注:

我在使用OwinHost.exe 3.0.1時(shí),Startup如果是如下情況下,它提示轉(zhuǎn)換失敗,不知是否是該版本的Bug。

  1. using AppFunc = Func<IDictionary<string, object>, Task>;
  2. public class Startup
  3. {
  4. public void Configuration(IAppBuilder app)
  5. {
  6. //使用OwinHost.exe,報(bào)錯(cuò),提示轉(zhuǎn)換失
  7. app.Run(context=>context.Response.WriteAsync("Hello World"));
  8. //使用OwinHost.exe 不報(bào)錯(cuò)
  9. //app.Use(new Func<AppFunc, AppFunc>(next => (env =>
  10. //{
  11. // string text = "Hello World";
  12. // var response = env["owin.ResponseBody"] as Stream;
  13. // var headers = env["owin.ResponseHeaders"] as IDictionary<string, string[]>;
  14. // headers["Content-Type"] = new[] { "text/plain" };
  15. // return response.WriteAsync(Encoding.UTF8.GetBytes(text), 0, text.Length);
  16. //})));
  17. }
  18. }

報(bào)錯(cuò)信息如下:

  • 使用Web Application

Web Application比類庫(kù)使用起來(lái)輕松多了,你可以直接運(yùn)行和調(diào)試,唯一比較弱的可能是它引用較多的程序集,你完全可以刪掉,比如System.Web。

通過(guò)Nuget安裝了OwinHost.exe之后,可以在Web中使用它,如下所示:

幾種指定啟動(dòng)項(xiàng)Startup的方法

  • 默認(rèn)名稱約束:默認(rèn)情況下Host會(huì)去查找root namespace下的名為Startup的類作為啟動(dòng)項(xiàng)。
  • OwinStartup Attribute:當(dāng)創(chuàng)建Owin Startup類時(shí),自動(dòng)會(huì)加上Attribute 如:[assembly: OwinStartup(typeof(JKXY.KatanaDemo.OwinHost.Startup))]
  • 配置文件,如: <add key="owin:appStartup" value="JKXY.KatanaDemo.Web.StartupDefault" />
  • 如果使用自定義Host,那么可以通過(guò)WebApp.Start<Startup>("http://localhost:10002") 來(lái)設(shè)置啟動(dòng)項(xiàng)。
  • 如果使用OwinHost,那么可以通過(guò)命令行參數(shù)來(lái)實(shí)現(xiàn),如下截圖所示

小結(jié)

花了好久才最終完成這篇博客,為大家講解了Katana的世界,那么接下來(lái)我將繼續(xù)OWIN & Katana之旅,探索Middleware的創(chuàng)建,謝謝大家支持。

本博客為木宛城主原創(chuàng),基于Creative Commons Attribution 2.5 China Mainland License發(fā)布,歡迎轉(zhuǎn)載,演繹或用于商業(yè)目的,但是必須保留本文的署名木宛城主(包含鏈接)。如您有任何疑問(wèn)或者授權(quán)方面的協(xié)商,請(qǐng)給我留言。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多