在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ C#/ ASP.NET MVC 隨想錄(6)——漫談 OWIN
ASP.NET MVC 使用 Bootstrap 系列(4)——使用 JavaScript 插件
ASP.NET MVC 隨想錄(6)——漫談 OWIN
ASP.NET MVC 隨想錄(5)——?jiǎng)?chuàng)建 ASP.NET MVC Bootstrap Helpers
ASP.NET MVC 隨想錄(3)——使用 Bootstrap 組件
ASP.NET MVC 隨想錄(7)——鋒利的 KATANA
ASP.NET MVC 隨想錄(1)——開(kāi)始使用 Bootstrap
ASP.NET MVC 隨想錄(8)——?jiǎng)?chuàng)建自定義的 Middleware 中間件
ASP.NET MVC 隨想錄(2)——使用 Bootstrap CSS 和 HTML 元素
作者簡(jiǎn)介

ASP.NET MVC 隨想錄(6)——漫談 OWIN

什么是 OWIN

OWIN 是 Open Web Server Interface for .NET 的首字母縮寫,他的定義如下:

OWIN 在.NET Web Servers 與 Web Application 之間定義了一套標(biāo)準(zhǔn)接口,OWIN 的目標(biāo)是用于解耦 Web Server 和 Web Application。基于此標(biāo)準(zhǔn),鼓勵(lì)開(kāi)發(fā)者開(kāi)發(fā)簡(jiǎn)單、靈活的模塊,從而推進(jìn).NET Web Development 開(kāi)源生態(tài)系統(tǒng)的發(fā)展。

正如你看到的這樣,OWIN 是接口、契約,而非具體的代碼實(shí)現(xiàn),僅僅是規(guī)范([specifications][1]),所以要實(shí)現(xiàn)自定義基于 OWIN 的 Web Server 必須要實(shí)現(xiàn)此規(guī)范。

歷時(shí)兩年(2010-2012),OWIN 的規(guī)范終于完成并且當(dāng)前版本是 1.0,在 OWIN 的官網(wǎng)上可以看到更具體的信息。

為什么我們需要 OWIN

過(guò)去,IIS 作為.NET 開(kāi)發(fā)者來(lái)說(shuō)是最常用的 Web Server(沒(méi)有之一),源于微軟產(chǎn)品的緊耦合關(guān)系,我們不得不將 Website、Web Application、Web API 等部署在 IIS 上,事實(shí)上在 2010 年前并沒(méi)有什么不妥,但隨著近些年來(lái) Web 的發(fā)展,特別是移動(dòng)互聯(lián)網(wǎng)飛速發(fā)展,IIS 作為 Web Server 已經(jīng)暴露出他的不足了。主要體現(xiàn)在兩個(gè)方面,ASP.NET (System.Web)緊耦合 IIS,IIS 緊耦合 OS,這就意味著,我們的 Web Framework 必須部署在微軟的操作系統(tǒng)上,難以跨平臺(tái)。

ASP.NET 和 IIS

我們知道,不管是 ASP.NET MVC 還是 ASP.NET WEB API 等都是基于 ASP.NET Framework 的,這種關(guān)系從前綴就可以窺倪出來(lái)。而 ASP.NET 的核心正是 System.Web 這個(gè)程序集,而且 System.Web緊耦合 IIS,他存在于.NET Framework 中。所以,這導(dǎo)致了 Web Framework 嚴(yán)重的局限性:

  • ASP.NET 的核心 System.Web,而 System.Web 緊耦合 IIS
  • System.Web 是.NET Framework 重要組成,已有 15 年以上歷史,沉重、冗余,性能差,難于測(cè)試,約 2.5M
  • System.Web 要更新和發(fā)布新功能必須等待.NET Framework 發(fā)布
  • .但 NET Framework 是 Windows 的基礎(chǔ),往往不會(huì)隨意更新。

所以要想獲取最新的 Web Framework 是非常麻煩的,幸運(yùn)的事,微軟已經(jīng)意識(shí)到了問(wèn)題的嚴(yán)重性,最新的 Web Framework 都是通過(guò) Nuget 來(lái)獲取。

當(dāng)然這是一部分原因,還有一層原因是 ASP.NET & IIS 實(shí)在太過(guò)于笨重,如何講呢?

復(fù)雜的生命周期已成為累贅?簡(jiǎn)單來(lái)說(shuō),當(dāng)請(qǐng)求到達(dá)服務(wù)器時(shí),Windows 內(nèi)核組件 HTTP.SYS 組件捕獲請(qǐng)求,他會(huì)分析請(qǐng)求并決定是否交給 IIS 來(lái)處理,當(dāng)請(qǐng)求到達(dá) IIS 之后,IIS 會(huì)根據(jù)處理程序映射來(lái)匹配請(qǐng)求并交給對(duì)應(yīng)的程序集(實(shí)現(xiàn)了 ISAPI 接口,比如我們熟知的 aspnet_isapi.dll 是專門用來(lái)處理 ASP.NET Application)處理,最后加載了 CLR 運(yùn)行環(huán)境,將請(qǐng)求交給 aspnet_wp.exe 去處理,這時(shí)復(fù)雜的 ASP.NET 生命周期往往令人頭大,但事實(shí)上有很多時(shí)候我們并不需要他。

如下圖所示 ASP.NET Architecture:

http://wiki.jikexueyuan.com/project/think-in-asp-net-mvc/images/Chapter6/2.png" alt="" />

打開(kāi) IIS,你會(huì)發(fā)現(xiàn)他提供了非常豐富的功能:緩存、身份驗(yàn)證、壓縮、加密等。但隨著移動(dòng)互聯(lián)網(wǎng)蓬勃的發(fā)展,特別是 HTML 5 越來(lái)越成熟的今天,我們看到越來(lái)越多的操作發(fā)生在客戶端,而不是沉重的從服務(wù)器產(chǎn)生 HTML 返回,更多的是通過(guò)異步 **AJAX** 返回原生的數(shù)據(jù)。同理,對(duì)于 APP 來(lái)說(shuō)我們只需要 Mobile Service 返回?cái)?shù)據(jù)。顯然 IIS 顯得笨重了點(diǎn),而且 IIS 作為微軟產(chǎn)品系的一環(huán),耦合程度太高。所以我們迫切需要輕量、快速、可擴(kuò)展的宿主來(lái)承載 Web Application 和 Web Service。

IIS 和 OS

IIS 必須是安裝并運(yùn)行在 Windows 操作系統(tǒng)中,這是微軟產(chǎn)品的一貫風(fēng)格,環(huán)環(huán)相套,但不得不考慮他們的限制和局限性:

  • IIS 往往和操作系統(tǒng)(Windows Server)綁定在一起,這意味著對(duì)于一些新功能如 WebSocket Protocol ,我們不得不等待操作系統(tǒng) Windows Sever 2012、Windows 8 的發(fā)布(IIS 8.0)。
  • 為了使用 WebSocket 這類新特性,他僅被 IIS 8.0 支持,如下所示:

http://wiki.jikexueyuan.com/project/think-in-asp-net-mvc/images/Chapter6/3.png" alt="" />

這時(shí)你不得不去升級(jí) IIS,但升級(jí)操作系統(tǒng)可能會(huì)引發(fā)舊系統(tǒng)的不穩(wěn)定性,所以要想平穩(wěn)的升級(jí) IIS 并不是簡(jiǎn)單的。

  • IIS 作為經(jīng)典的 Web Server 必須安裝在 Windows 系統(tǒng)中,Windows Server 需要授權(quán)使用。

正是由于微軟產(chǎn)品系緊耦合的關(guān)系,才造成跨平臺(tái)上的不足,這也是被飽受詬病。所以我們需要**OWIN 來(lái)解耦,在面向?qū)ο蟮氖澜缋?,接口往往是解耦的關(guān)鍵,如下圖所示:**

http://wiki.jikexueyuan.com/project/think-in-asp-net-mvc/images/Chapter6/4.png" alt="" />

使用 OWIN,Web Framework 不再依賴 IIS 和 OS,這意味著你能使用任何你想的來(lái)替換 IIS(比如:Katana 或者 Nowin),并且在必要時(shí)隨時(shí)升級(jí),而不是更新操作系統(tǒng)。當(dāng)然,如果你需要的話,你可以構(gòu)建自定義的宿主和 Pipeline 去處理 Http 請(qǐng)求。

這一切的改變都是由于OWIN 的出現(xiàn),他提供了明晰的規(guī)范以便我們快速靈活的去擴(kuò)展 Pipeline 來(lái)處理 Http 請(qǐng)求,甚至可以不寫任何一句代碼來(lái)切換不同的 Web Server,前提是這些 Web Server 遵循 OWIN 規(guī)范。

OWIN 的規(guī)范

現(xiàn)在我們已經(jīng)了解了什么是 OWIN 已經(jīng)為什么需要 OWIN,現(xiàn)在是時(shí)候來(lái)分析一下 OWIN 的規(guī)范了。

OWIN Layers

實(shí)際上,OWIN 的規(guī)范非常簡(jiǎn)單,他定義了一系列的層(Layer),并且他們的順序是以堆(Stack)的形式定義,如下所示。OWIN 中的接口被稱之為應(yīng)用程序委托或者 AppFunc,用來(lái)在這些層之間通信。

http://wiki.jikexueyuan.com/project/think-in-asp-net-mvc/images/Chapter6/5.png" alt="" />

OWIN 定義了 4 層:

Host:主要負(fù)責(zé)應(yīng)用程序的配置和啟動(dòng)進(jìn)程,包括初始化 OWIN Pipeline、運(yùn)行 Server。

Server:這是實(shí)際的 Http Server,綁定套接字并監(jiān)聽(tīng)的 HTTP 請(qǐng)求然后將 Request 和 Response 的 Body、Header 封裝成符合 OWIN 規(guī)范的字典并發(fā)送到 OWIN Middleware Pipeline 中,最后Application 為 Response Data 填充合適的字段輸出。

Middleware:稱之為中間件、組件,位于 Server 與 Application 之間,用來(lái)處理發(fā)送到 Pipeline 中的請(qǐng)求,這類組件可以是簡(jiǎn)單的 Logger 或者是復(fù)雜的 Web Framework 比如 Web API、SignalR,只要 Sever 連接成功,Middleware 中間件可以是任何實(shí)現(xiàn)應(yīng)用程序委托的組件。

Application:這是具體的應(yīng)用程序代碼,可能在 Web Framework 之上。對(duì)于 Web API、SignalR這類 Web Framework 中間件而言,我們僅僅是改變了他們的托管方式,而不是取代 ASP.NET WEB API、SignalR 原先的應(yīng)用程序開(kāi)發(fā)。所以該怎么開(kāi)發(fā)就怎么開(kāi)發(fā),只不過(guò)我們將他們注冊(cè)到 OWIN Pipeline 中去處理 HTTP 請(qǐng)求,成為 OWIN 管道的一部分,所以此處的 Application 即正在意義上的處理程序代碼。

Application Delegate

OWIN 規(guī)范另一個(gè)重要的組成部分是接口的定義,用于 Server 和 Middleware 的交互。他并不是嚴(yán)格意義上的接口,而是一個(gè)委托并且每個(gè) OWIN 中間件組件必須提供。

http://wiki.jikexueyuan.com/project/think-in-asp-net-mvc/images/Chapter6/6.png" alt="" />

從字面上理解,每個(gè) OWIN 中間件在必須有一個(gè)方法接受類型了 IDictionary<string,object>的變量(俗稱環(huán)境字典),然后必須返回 Task 來(lái)異步執(zhí)行。

Environment Dictionary

環(huán)境字典包含了 Request、Response 所有信息以及 Server State。通過(guò) Pipeline,每個(gè)中間件組件和層都可以添加額外的信息,但環(huán)境字典定義了一系列強(qiáng)制必須存在的 Key,如下所示: http://wiki.jikexueyuan.com/project/think-in-asp-net-mvc/images/Chapter6/key.png" alt="" />

小結(jié)

這些規(guī)范看起來(lái)可能簡(jiǎn)單到微不足道,但 OWIN 的思想就是簡(jiǎn)單、靈活——通過(guò)要求 OWIN 中間件只依賴 AppFun 類型,為開(kāi)發(fā)基于 OWIN 的中間件提供了的最低門檻。同時(shí),通過(guò)使用環(huán)境字典在各個(gè)中間件之間進(jìn)行信息的傳遞,而非傳統(tǒng) ASP.NET(System.Web)中使用 HttpContext 貫穿 ASP.NET 整個(gè)生命周期來(lái)傳遞。 既然 OWIN 是規(guī)范,而非真正實(shí)現(xiàn),所以是無(wú)法使用在項(xiàng)目中的,若要使用 OWIN,必須要實(shí)現(xiàn)他,所以這也是接下來(lái)我想聊的,OWIN 的實(shí)現(xiàn):Katana 。