下一代Asp.net開發規範OWIN(2)—— Katana介紹以及使用

接上篇OWIN產生的背景以及簡單介紹,在瞭解了OWIN規範的前因後果後,接下來看一下Katana這個OWIN規範的實現,並看看如何使用在咱們的Web開發中。html

閱讀目錄:瀏覽器

一. 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遷移到在自定義Hostapp

三. OWIN Startup配置類詳解框架

     3.1 怎麼沒有OWIN規範中的IDictionary<string, object>和Func<IDictionary<string, object>, Task>?
     3.2 Host是如何連接到Startup類的?函數

一. Katana項目的結構和包含的內容

經過了解Katana項目結構,咱們可以更加深刻的理解OWIN規範。下面這張圖就是Katana項目的主要架構。post

image

上圖中的各個部分解釋:ui

1.1 Host

宿主只是一個進程,是整個OWIN程序的載體。這個宿主能夠是IIS, IIS Express, Console, Windows Service等。
Host的主要做用:
1. 管理底層進程
2. 當有請求過來的時候,選擇相應的Server和構建OWIN管道處理請求。this

咱們最熟悉的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程序。

owin01

在彈出框中,選擇Empty模板

owin02

從Nuget中添加支持包

下一步是添加OWIN的支持包。從Tools-> Library Package Manager-> Package Manager Console. 而後在命令窗口中,運行install-package Microsoft.Owin.Host.SystemWeb.
也能夠直接在nuget包管理界面上添加

justrun-blog11

添加Startup啓動類
Startup類的做用是用來初始化OWIN管道,這裏,咱們添加和初始化OWIN管道中的Middleware.

owin03

在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.
啓動程序運行,結果頁面以下:

owin05

2.2 將Hello World遷移到在自定義Host

從IIS Host遷移到自定義Host很是簡單。使用IIS Host, IIS同時充當了Host和Server的角色。在自定義Host中, 咱們將用Console程序做爲Host, 同時用HttpListener來做爲Server,監聽固定端口發送的Http請求.
首先建立一個簡單的Console應用程序,用Nuget添加Microsoft.Owin.SelfHost

justrun-blog12

一樣添加上咱們的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

相關文章
相關標籤/搜索