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

對於開發人員來講,代碼就是最好的文檔,如上一篇博文所說,下面咱們就會基於Kanata項目的一些具體調用代碼,來進一步深刻理解OWIN的實現和做用.瀏覽器

今天咱們先針對Host和Server來實現一個簡單的應用.服務器

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

Host開發

如上篇博文說起,Host具備以下特色:函數

  • 實現一個宿主進程
  • 負責Server的啓動和關閉
  • 負責Middleware和Application的裝載

最簡單的宿主進程就是Console Application,那麼咱們從創建Console程序開始ui

 

注意這個程序和它的入口類(通常是Program.cs)就是咱們所說的Host宿主進程的實現.url

而具體的Host和Server的實現咱們就須要藉助Kanata項目的實現了.spa

首先經過Nuget獲取Kanata的Host實現. 包名爲: Microsoft.Owin.Hosting線程

 

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

WebApp.Start

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

 

咱們能夠看到,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組件

 

 

安裝,並引入項目,有了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的標準.

相關文章
相關標籤/搜索