免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

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

ASP.NET 發(fā)展歷程

ASP.NET Web Form

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

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

為了迎合這兩類開發(fā)者,ASP.NET Web Form通過使用沉重的ViewState來保存頁面回傳過程中的狀態(tài)值,因為HTTP協(xié)議是無狀態(tài)的,通過ViewState,使原本沒有記憶的Http協(xié)議變得有記憶起來。這在當時是非常好的設(shè)計,能通過拖拽控件的形式快速開發(fā)Web,而不必過多的去關(guān)注底層原理。同時ASP.NET團隊還為ASP.NET豐富了更多的功能、諸如:SessionCache、Configuration等等。

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

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

ASP.NET MVC

由于Web Form產(chǎn)生一大堆ViewState和客戶端腳本,這對開發(fā)者來說慢慢變成一種累贅,因為我們只想產(chǎn)生純凈的HTML標記。所以開發(fā)者更想去主動控制而非被動產(chǎn)生額外HTML標記。

所以微軟基于MVC設(shè)計模式推出了其重要的Web Framework——ASP.NET MVC Framework,通過Model-View-Control解耦了業(yè)務(wù)邏輯和表現(xiàn)邏輯,同時沒有了服務(wù)器端控件,將頁面的控制權(quán)完全交給了開發(fā)者。

為了快速更新迭代,通過Nuget來獲取更新,故從.NET Framework中分離開了。

但唯一不足的是,ASP.NET MVC還是基于ASP.NET Framework(注:ASP.NET MVC 6已經(jīng)不依賴System.Web),所以Web ApplicationWeb Server依舊沒有解耦。

ASP.NET Web API

隨著時間的推移,一些問題開始暴露出來了,由于Web ServerWeb Application緊耦合在一起,微軟在開發(fā)獨立、簡單的Framework上越發(fā)捉襟見肘,這和其他平臺下開源社區(qū)蓬勃發(fā)展形成鮮明對比,幸運的是,微軟做出了改變,推出了獨立的Web Framework ——ASP.NET Web API,他適用于移動互聯(lián)網(wǎng)并可以快速通過Nuget安裝,更為重要的是,他不依賴System.Web,也不依賴IIS,你可以Self-Host或者在其他Web Server部署。

Katana

隨著Web API能夠運行在自己的輕量級的宿主中,并且越來越多簡單、模塊化、專一的Framework問世,開發(fā)人員有時候不得不啟動單獨的進程來處理Web應(yīng)用程序的各種組件(模塊)、如靜態(tài)文件、動態(tài)文件、Web APISocket。為了避免進程擴散,所有的進程必須啟動、停止并且獨立進行管理。這時,我們需要一個公共的宿主進程來管理這些模塊。

這就是OWIN誕生的原因,解耦成最小粒度的組件,然后這些標準化框架和組件可以很容易地插入到OWIN Pipeline中,從而對組件進行統(tǒng)一管理。而Katana正是OWIN的實現(xiàn),為我們提供了豐富的HostServer。

走進Katana的世界

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

Katana的基本原則

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

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

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

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

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

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

2.Server

Host之后的Layer被稱為Server,他負責(zé)打開套接字并監(jiān)聽Http請求,一旦請求到達,根據(jù)Http請求來構(gòu)建符合OWIN規(guī)范的Environment Dictionary(環(huán)境字典)并將它發(fā)送到Pipeline中交由Middleware處理。KatanaOWIN Server的實現(xiàn)分為如下幾類:

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

3Middleware

Middleware(中間件)位于HostServer之后,用來處理Pipeline中的請求,Middleware可以理解為實現(xiàn)了OWIN應(yīng)用程序委托AppFun的組件。

Middleware處理請求之后并可以交由下一個Pipeline中的Middleware組件處理,即鏈式處理請求,通過環(huán)境字典可以獲取到所有的Http請求數(shù)據(jù)和自定義數(shù)據(jù)。Middleware可以是簡單的Log組件,亦可以為復(fù)雜的大型Web Framework,諸如:ASP.NET Web API、Nancy、SignlR等,如下圖所示:Pipeline中的Middleware用來處理請求:

4.Application

最后一層即為Application,是具體的代碼實現(xiàn),比如ASP.NET Web APISignalR具體代碼的實現(xiàn)。

現(xiàn)在,我想你應(yīng)該了解了什么事Katana以及Katana的基本原則和體系結(jié)構(gòu),那么現(xiàn)在就是具體應(yī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啟動類

StartupConfiguration方法中實現(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方法將一個接受IOwinContext對象最為輸入?yún)?shù)并返回TaskLambda表達式作為OWIN Pipeline的最后處理步驟,IOwinContext強類型對象是對Environment Dictionary的封裝,然后異步輸出"Hello World"字符串。

細心的你可能觀察到,在Nuget安裝Microsoft.Owin.Host.SystemWeb程序集時,默認安裝了依賴項Microsoft.Owin程序集,正式它為我們提供了擴展方法RunIOwinContext接口,當然我們也可以使用最原始的方式來輸出"Hello World"字符串,即Owin程序集為我們提供的最原始方式,這僅僅是學(xué)習(xí)上參考,雖然我們不會在正式場景下使用:

  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托管差別不大,你可以使用控制臺、WinForm、WPF等實現(xiàn)托管,但要記住,這會失去IIS帶有的一些功能(SSL、Event Log、DiagnosticsManagement…),當然這可以自己來實現(xiàn)。

  • 創(chuàng)建控制臺應(yīng)用程序
  • Install-Package Microsoft.Owin.SelfHost
  • Main方法中使用Startup配置項構(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("啟動站點:http://localhost:10002");
  6. System.Console.ReadLine();
  7. }
  8. }

使用自定義的Host將失去IIS的一些功能,當然我們可以自己去實現(xiàn)。幸運的是,Katana為我們默認實現(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. //將請求記錄在控制
  8. Trace.WriteLine(context.Request.Uri);
  9. //顯示錯誤
  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. }

在上述代碼中,當請求的路徑(Request.Path)為根目錄時,渲染輸出Webcome Page并且不繼續(xù)執(zhí)行Pipeline中的其余Middleware組件,如下所示:

如果請求的路徑為Error時,拋出異常,顯示錯誤頁,如下所示:

使用OwinHost.exe托管Katana-based應(yīng)用程序

當然我們還可以使用Katana提供的OwinHost.exe來托管應(yīng)用程序,毫無疑問,通過Nuget來安裝OwinHost。

如果你按照我的例子一步一步執(zhí)行的話,你會發(fā)現(xiàn)不管使用ASP.NET/IIS托管還是自托管,Startup配置類都是不變的,改變的僅僅是托管方式。同理OwinHost也是一樣的,但它更靈活,我們可以使用類庫或者Web應(yīng)用程序來作為Application。

  • 使用類庫

類庫作為Application,可以最小的去引用程序集,創(chuàng)建一個類庫后,刪除默認的Class1.cs,然后并且添加Startup啟動項,這會默認像類庫中添加Owin和Microsoft.Owin程序集的引用。

然后,使用Nuget來安裝OwinHost.exe,如Install-Package OwinHost,注意它并不是一個程序集,而是.exe應(yīng)用程序位于<solution root>/packages/OwinHost.(version)/tools文件夾。

因為類庫不能直接運行,那么只能在它的根目錄調(diào)用OwinHost.exe來托管,它將加載.\bin文件下所有的程序集,所以需要改變類庫的默認輸出,如下所示:

然后編譯解決方案,打開cmd,鍵入如下命令:

如上圖成功啟動了宿主Host并且默認監(jiān)聽5000端口。

OwinHost.exe還提供自定義參數(shù),通過追加-h來查看,如下所示:

既然類庫不能直接運行,當然你也不能直接進行調(diào)試,我們可以附加OwinHost進程來進行調(diào)試,如下所示:

注:

我在使用OwinHost.exe 3.0.1時,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,報錯,提示轉(zhuǎn)換失
  7. app.Run(context=>context.Response.WriteAsync("Hello World"));
  8. //使用OwinHost.exe 不報
  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. }

報錯信息如下:

  • 使用Web Application

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

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

幾種指定啟動項Startup的方法

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

小結(jié)

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

本博客為木宛城主原創(chuàng),基于Creative Commons Attribution 2.5 China Mainland License發(fā)布,歡迎轉(zhuǎn)載,演繹或用于商業(yè)目的,但是必須保留本文的署名木宛城主(包含鏈接)。如您有任何疑問或者授權(quán)方面的協(xié)商,請給我留言。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
[ASP.NET] 下一代ASP.NET開發(fā)規(guī)范:OWIN
ASP.NET MVC隨想錄(1):漫談OWIN
MVC5
NET計劃之配置ASP.NET運行環(huán)境
IIS上注冊.Net
詳細圖解SharePoint 2007部署和配置過程
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服