標籤:style blog http color os io 使用 ar strong
接上篇OWIN產生的背景以及簡單介紹,在瞭解了OWIN規範的來龍去脈後,接下來看一下Katana這個OWIN規範的實現,並看看如何使用在我們的Web開發中。
閱讀目錄:
一. Katana項目的結構和包含的內容
1.1 Host
1.2 Server
1.3 Middleware
1.4 Application
二. Katana範例程式碼Hello World
2.1 使用IIS Host運行Hello World
2.2 將Hello World遷移到在自訂Host
三. OWIN Startup配置類詳解
3.1 怎麼沒有OWIN規範中的IDictionary<string, object>和Func<IDictionary<string, object>, Task>?
3.2 Host是如何連結到Startup類的?
一. Katana項目的結構和包含的內容
通過瞭解Katana項目結構,我們能夠更加深入的理解OWIN規範。下面這張圖就是Katana項目的主要架構。
中的各個部分解釋:
1.1 Host
宿主只是一個進程,是整個OWIN程式的載體。這個宿主可以是IIS, IIS Express, Console, Windows Service等。
Host的主要作用:
1. 管理底層進程
2. 當有請求過來的時候,選擇相應的Server和構建OWIN管道處理請求。
我們最熟悉的Host就是IIS/Asp.net. 不過IIS既是Host, 也是Server. 在IIS中使用標準的HttpModule和HttpHandler類型來響應請求。Katana通過在IIS上構建一個類似適配器,使得OWIN管道能夠運行在IIS上。
我們還可以自己實現一個簡單的Host, 這個Host可以在Console中,也可以是一個Windows Service進程。同時Katana也已經提供了一個可以直接運行Host——OwinHost.exe
1.2 Server
負責綁定到 TCP 通訊埠,監聽連接埠發送過來的請求,同時將請求的資訊依照OWIN規範,封裝成字典格式,傳遞到下層的Middleware.
Katana項目包含了2個Server實現:
Microsoft.Owin.Host.SystemWeb
這個是用來對應IIS的,由於IIS既是Host,又是Server. 所以這個Server實現的作用是註冊ASP.NET HttpModule和HttpHandler阻斷原有的處理流程,轉而把請求發送到OWIN管道中處理。
Microsoft.AspNet.Host.SystemWeb依賴於Sysetm.Web, 和IIS耦合厲害,所以無法遷移到非IIS伺服器
Microsoft.Owin.Host.HttpListener
使用HttpListener開啟Socket連接埠,監聽請求,然後將請求封裝發送到OWIN管道中處理。
1.3 Middleware:
這是為組成 OWIN 管道中的組件。 它可以是從簡單壓縮組件到 ASP.NET Web API 這樣的完整架構.
當從用戶端發送一個請求,這個請求就會傳到OWIN管道中處理。這個管道是在startup code中初始化的。組成管道的組件就是Middleware.
要遵循OWIN標準,Middleware應該要實現
Func<IDictionary<string, object>, Task>
Katana提供了一個OwinMiddleware基類更加方便我們繼承來實現OWIN Middleware.
1.4 Application
這是您的程式碼。 由於 Katana 並不取代 ASP.NET,而是一種編寫和託管組件的新方式,因此現有的 ASP.NET Web API 和 SignalR 應用程式將保持不變,因為這些架構可以參與 OWIN 管道。 事實上,對於這些類型的應用程式,Katana 組件只需使用一個小的配置類即可見。
OWIN和Katana並不是一個全新的開發方式,並不取代 ASP.NET,是實現Host, Server和Applicantion之間解耦,是一種編寫和託管組件的新方式 。比如使用OWIN方式開發Web API, 我們仍然還是使用Asp.net Web API. 只是Web API變成了我們OWIN管道的一個組成部分了。正常開發中,我們感覺不到OWIN的存在,只是在startup代碼中,構建我們的OWIN管道。通常,對於Web API和SignalR這種大型組件,我們都是註冊在OWIN管道的最後。但是像authentication , cache這樣的組件,我們通常會註冊到管道前部。
二. Katana範例程式碼Hello World
下面的樣本是在VS 2013中操作的。
2.1 使用IIS Host運行Hello World
使用IIS作為宿主,是我們常用的方式。通過在IIS上建立一個OWIN管道,運行我們的程式。
首先,在VS2013中,建立一個新的Asp.net程式。
在彈出框中,選擇Empty模板
從Nuget中添加支援包
下一步是添加OWIN的支援包。從Tools-> Library Package Manager-> Package Manager Console. 然後在命令視窗中,運行install-package Microsoft.Owin.Host.SystemWeb.
也可以直接在nuget包管理介面上添加
添加Startup啟動類
Startup類的作用是用來初始化OWIN管道,這裡,我們添加和初始化OWIN管道中的Middleware.
在Startup1.Configuration方法中,添加如下代碼:
public void Configuration(IAppBuilder app){ // New code: app.Run(context => { context.Response.ContentType = "text/plain"; return context.Response.WriteAsync("Hello, world."); });}
上面的代碼做的事情,就是把一個簡單的Middleware註冊到OWIN管道中。這個中介軟體完成的事情非常簡單: 當接受到請求的時候,輸出Hello World.
啟動程式運行,結果頁面如下:
2.2 將Hello World遷移到在自訂Host
從IIS Host遷移到自訂Host非常簡單。使用IIS Host, IIS同時充當了Host和Server的角色。在自訂Host中, 我們將用Console程式作為Host, 同時用HttpListener類來作為Server,監聽固定連接埠發送的Http請求.
首先建立一個簡單的Console應用程式,用Nuget添加Microsoft.Owin.SelfHost
同樣添加上我們的Startup1.cs, 然後將我們的Console程式改造成Host宿主。
class Program{ static void Main(string[] args) { using (Microsoft.Owin.Hosting.WebApp.Start<Startup1>("http://localhost:9000")) { Console.WriteLine("Press [enter] to quit..."); Console.ReadLine(); } }}
啟動程式,然後在瀏覽器中鍵入http://localhost:9000訪問.
可以看到,OWIN的應用,耦合關聯非常少,非常容易地在不同的Host之間遷移。以後在有除IIS外更多優秀的Host/Server湧現的時候,我們的選擇就會更多
三. OWIN Startup配置類詳解
上面我們分別用IIS和Console為宿主,運行了一個簡單的Hello World程式。雖然只是一個簡單的Hello World, 其實裡麵包含的內容還是挺多的,下面就來一一介紹。
3.1 怎麼沒有OWIN規範中的IDictionary<string, object>和Func<IDictionary<string, object>, Task>?
上篇文章中,講到OWIN規範的時候,提到過在OWIN管道中傳輸的資料形式是IDictionary<string, object>,但是在我們的代碼中,並沒有出現.
原因是在微軟的OWIN實現中,將字典類型封裝到了IOwinContext介面類型中。其實可以通過屬性Environment可以訪問到該字典,同時還封裝常用的request, reponse屬性。這樣我們就無需直接和IDictionary<string, object>打交道, 在OWIN規範上,字典類型是個非常好的設計,簡單通用,但是在實際開發中,直接操作字典類型擷取object, 然後再轉換類型等畢竟不是一個直觀和方便的過程。
我們的Startup.cs代碼中,下面的context參數類型,其實就是IOwinContext.
app.Run(context =>
{
context.Response.ContentType = "text/plain";
return context.Response.WriteAsync("Hello, world.");
});
關於另外一個問題,Func<IDictionary<string, object>, Task>在哪裡?我們來看看Run函數的定義就一目瞭然了:
public static void Run(this IAppBuilder app, Func<Microsoft.Owin.IOwinContext, System.Threading.Tasks.Task> handler);
Startup.cs中,主要完成的工作,就是使用IAppBuilder來註冊Middleware到OWIN管道中。我們用lambda運算式註冊的Hello World, 其實就是一個Middleware組件,只是這個Middleware組件太簡單了。
3.2 Host是如何連結到Startup類的?
無論你使用IIS, IIS Express還是OWIN Host, 微軟在這些Host上實現的Service都會依照特定的規則來尋找到Startup類,執行Configuration方法,註冊Middleware.
預設名稱匹配
可以定義Startup.cs類,只要這個類的namespace和Assembly的名稱相同。那麼,這個Startup.cs中的Configuration方法,就會在OWIN管道初始化的時候執行。
使用OwinStartup Attribute
這就是我們例子中使用的方式,直接指定哪個具體類是Startup類。
在設定檔的appSetting 節點設定
<appSettings> <add key="owin:appStartup" value="StartupDemo.ProductionStartup" /></appSettings>
通過上面的講解,希望能協助大家理解Katana在實際項目中的使用。
下一篇中,更加接近實戰,一起看看我們編寫Middleware
下一代Asp.net開發規範OWIN(2)—— Katana介紹以及使用