天天看點

OWIN的了解和實踐(二) – Host和Server的開發

對于開發人員來說,代碼就是最好的文檔,如上一篇博文所說,下面我們就會基于Kanata項目的一些具體調用代碼,來進一步深入了解OWIN的實作和作用.

今天我們先針對Host和Server來實作一個簡單的應用.

我們的開發環境是:  VS2013 Update 3,  .Net Framework 4.5.1

Host開發

如上篇博文提及,Host具有如下特點:

  • 實作一個宿主程序
  • 負責Server的啟動和關閉
  • 負責Middleware和Application的裝載

最簡單的宿主程序就是Console Application,那麼我們從建立Console程式開始

OWIN的了解和實踐(二) – Host和Server的開發

注意這個程式和它的入口類(一般是Program.cs)就是我們所說的Host宿主程序的實作.

而具體的Host和Server的實作我們就需要借助Kanata項目的實作了.

首先通過Nuget擷取Kanata的Host實作. 包名為: Microsoft.Owin.Hosting

OWIN的了解和實踐(二) – Host和Server的開發

注: 目前版本為3.0.1, Owin的2個核心元件:  Owin和Microsoft.Owin會被同時載入.

WebApp.Start

Host的主要用途是啟動和關閉Server, 這個功能的實作類就是在Microsoft.Owin.Hosting下的WebApp類, 請看類結構:

OWIN的了解和實踐(二) – Host和Server的開發

我們可以看到,WebApp隻有若幹個Start函數,輔助于StartOptions類,依靠這2個類,就能完成Host對Server的啟動和關閉.

Start函數有好幾個重載,我們來看一個最為典型的實作. (其他實作大同小異,如果要使用請參閱相關文檔)

public static System.IDisposable Start(Microsoft.Owin.Hosting.StartOptions options, System.Action<IAppBuilder> startup)

  • Options參數定義了Server啟動所需的參數.
  • Startup參數是一個以Owin.IAppbuilder接口為參數的函數,通過這個函數,完成對Server所需Middleware的加載工作,這也是Host的關鍵作用之一!
  • 函數傳回一個實作IDisposable接口的類, 可以預見的是,當這個類Dispose的時候,被這個函數啟動的Server也會同時關閉和消亡.

StartOptions

我們先來看下這個StartOptions中2個比較關鍵的屬性:

public System.Collections.Generic.IList<string> Urls { get; }

Urls參數是以http标準url為格式字元串來定義Server監聽的HostName和Port.

标準格式是 http(s)://hostname:port ; 比如 http://localhost:8080 ;  https://192.168.1.1:9000;

注意,Urls可以加多個,表示支援不同的hostname和port映射. 另外, 還支援http://*:9000 這樣的格式,表示映射所有HostName,這個和IIS映射配置其實是類似的.

public string ServerFactory { set; get; }

關鍵的來了,這個就是Server實作類的assembly name, 大家不難想到,通過這個屬性,Host和Server是完全解耦的. 我們的這個Host可以和任何符合Owin接口的Server實作進行組合. 當然,目前還是使用自家的Server實作,請看下節.

Server實作和引用

Http Server并不是一兩句代碼可以實作的, 這裡我們還是繼續站在Kanata的肩膀上,借用它的Server實作.  他的Server實作包名為 :  Microsoft.Owin.Host.HttpListener (我認為這裡的Host改名為Server更加貼切)

首先還是使用Nuget擷取該Server元件

OWIN的了解和實踐(二) – Host和Server的開發

安裝,并引入項目,有了Server的實作,下面我們來完成StartOptions的定義代碼:

//初始化StartOptions參數
            StartOptions options = new StartOptions();
            //伺服器Url設定
            options.Urls.Add("http://localhost:9000");
            options.Urls.Add("http://192.168.1.1:8080");
            //Server實作類庫設定
            options.ServerFactory = "Microsoft.Owin.Host.HttpListener";      

需要注意的是,我這裡特地放了2個port不同的位址,這2個Url都能起到效果; 另外Microsoft.Owin.Host.HttpListener 其實是預設的Host ServerFatory實作(最後一行代碼可以省略); 但我們必須了解,這裡是可以解耦的,我們完全可以橋接其他的Server實作.

Startup函數和使用

Startup函數非常的簡單,就是一個隻有一個沒有傳回值的,隻有一個Owin.IAppBuilder參數的函數(函數名任意,不一定要叫Startup). 如以下代碼:

private static void Startup(Owin.IAppBuilder app)
        {
            //這裡通過app句柄,為目前Server加入所有需要的middleware
        }      

在這個函數中,通過app參數提供的句柄,一步步的加入Server所需要的所有Middleware,當然這些Middleware都是可自由組合,自由拆卸的,非常的靈活.

Server的啟動和關閉

有了Options和Startup函數,我們就可以啟動我們的Server了,整合的代碼如下:

/// <summary>
        /// Owin Host 主程序入口函數
        /// </summary>

        static void Main()
        {
            //初始化StartOptions參數
            StartOptions options = new StartOptions();

            //伺服器Url設定
            options.Urls.Add("http://localhost:9000");
            options.Urls.Add("http://192.168.1.1:8080");

            //Server實作類庫設定
            options.ServerFactory = "Microsoft.Owin.Host.HttpListener";
   
            //以目前的Options和Startup啟動Server
            using (WebApp.Start(options, Startup))
            {
                //顯示啟動資訊,通過ReadLine駐留目前程序
                Console.WriteLine("Owin Host/Server started,press enter to exit it...");
                Console.ReadLine();
            }//Server在Dispose中關閉
        }

        private static void Startup(Owin.IAppBuilder app)
        {
            //這裡通過app句柄,為目前Server加入所有需要的middleware
        }      

Server的關閉很簡單,當using的結尾觸發Dispose時,該Server被自動關閉.

Server是獨立線程運作的,是以宿主程序必須駐留,這裡用Console.ReadLine()駐留目前線程,保證Server長期運作.

其他注意點

  • 很多機器上出現權限不夠情況,請用管理者賬号運作VS2013.
  • 用浏覽器通路2個位址時發現可以聯通,但Reponse為空,這符合上一篇中說提到的: Server僅僅是一個空的實作,在沒有任何Middleware裝載的情況下(我們的Startup函數為空),所有的Request都隻能獲得一個空的Response這一論點.
  • 加入不同的Middleware能夠實作不同的Reponse傳回,這個将在以後的篇幅中繼續讨論.
  • 盡量用Nuget擷取我們需要的元件包,以保證元件正确性和版本統一.

總結下,我們開發了一個以Console Application為宿主程序的程式,通過Kanata的Host實作Microsoft.Owin.Hosting啟動了它自身的Server實作 Microsoft.Owin.Host.HttpListener, 目前沒有加入任何Middleware和Application實作.

這裡再羅嗦一句, Kanata的Host和Server實作完全可以被自己或者第三方的實作所取代,前提是,符合OWIN的标準.

軟體開發,項目管理,開發管理,團隊管理.

CMMI,PMP

繼續閱讀