乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      下一代Asp.net開(kāi)發(fā)規(guī)范OWIN(2)—— Katana介紹以及使用

       昵稱10504424 2014-09-15

      接上篇OWIN產(chǎn)生的背景以及簡(jiǎn)單介紹,在了解了OWIN規(guī)范的來(lái)龍去脈后,接下來(lái)看一下Katana這個(gè)OWIN規(guī)范的實(shí)現(xiàn),并看看如何使用在我們的Web開(kāi)發(fā)中。

      閱讀目錄:

      一. Katana項(xiàng)目的結(jié)構(gòu)和包含的內(nèi)容

           1.1 Host
           1.2 Server
           1.3 Middleware
           1.4 Application

      二. Katana示例代碼Hello World

           2.1 使用IIS Host運(yùn)行Hello World
         2.2 將Hello World遷移到在自定義Host

      三. OWIN Startup配置類詳解

           3.1 怎么沒(méi)有OWIN規(guī)范中的IDictionary<string, object>和Func<IDictionary<string, object>, Task>?
           3.2 Host是如何鏈接到Startup類的?

      一. Katana項(xiàng)目的結(jié)構(gòu)和包含的內(nèi)容

      通過(guò)了解Katana項(xiàng)目結(jié)構(gòu),我們能夠更加深入的理解OWIN規(guī)范。下面這張圖就是Katana項(xiàng)目的主要架構(gòu)。

      image

      上圖中的各個(gè)部分解釋:

      1.1 Host

      宿主只是一個(gè)進(jìn)程,是整個(gè)OWIN程序的載體。這個(gè)宿主可以是IIS, IIS Express, Console, Windows Service等。
      Host的主要作用:
      1. 管理底層進(jìn)程
      2. 當(dāng)有請(qǐng)求過(guò)來(lái)的時(shí)候,選擇相應(yīng)的Server和構(gòu)建OWIN管道處理請(qǐng)求。

      我們最熟悉的Host就是IIS/Asp.net.  不過(guò)IIS既是Host, 也是Server. 在IIS中使用標(biāo)準(zhǔn)的HttpModule和HttpHandler類型來(lái)響應(yīng)請(qǐng)求。Katana通過(guò)在IIS上構(gòu)建一個(gè)類似適配器,使得OWIN管道能夠運(yùn)行在IIS上。
      我們還可以自己實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Host, 這個(gè)Host可以在Console中,也可以是一個(gè)Windows Service進(jìn)程。同時(shí)Katana也已經(jīng)提供了一個(gè)可以直接運(yùn)行Host——OwinHost.exe

      1.2 Server

      負(fù)責(zé)綁定到 TCP 端口,監(jiān)聽(tīng)端口發(fā)送過(guò)來(lái)的請(qǐng)求,同時(shí)將請(qǐng)求的信息依照OWIN規(guī)范,包裝成字典格式,傳遞到下層的Middleware.
      Katana項(xiàng)目包含了2個(gè)Server實(shí)現(xiàn):
      Microsoft.Owin.Host.SystemWeb
      這個(gè)是用來(lái)對(duì)應(yīng)IIS的,由于IIS既是Host,又是Server. 所以這個(gè)Server實(shí)現(xiàn)的作用是注冊(cè)ASP.NET HttpModule和HttpHandler阻斷原有的處理流程,轉(zhuǎn)而把請(qǐng)求發(fā)送到OWIN管道中處理。
      Microsoft.AspNet.Host.SystemWeb依賴于Sysetm.Web, 和IIS耦合厲害,所以無(wú)法遷移到非IIS服務(wù)器

      Microsoft.Owin.Host.HttpListener
      使用HttpListener打開(kāi)Socket端口,監(jiān)聽(tīng)請(qǐng)求,然后將請(qǐng)求包裝發(fā)送到OWIN管道中處理。

      1.3 Middleware:

      這是為組成 OWIN 管道中的組件。 它可以是從簡(jiǎn)單壓縮組件到 ASP.NET Web API 這樣的完整框架.
      當(dāng)從客戶端發(fā)送一個(gè)請(qǐng)求,這個(gè)請(qǐng)求就會(huì)傳到OWIN管道中處理。這個(gè)管道是在startup code中初始化的。組成管道的組件就是Middleware.
      要遵循OWIN標(biāo)準(zhǔn),Middleware應(yīng)該要實(shí)現(xiàn)

      Func<IDictionary<string, object>, Task>

      Katana提供了一個(gè)OwinMiddleware基類更加方便我們繼承來(lái)實(shí)現(xiàn)OWIN Middleware.

      1.4 Application

      這是您的程序代碼。 由于 Katana 并不取代 ASP.NET,而是一種編寫和托管組件的新方式,因此現(xiàn)有的 ASP.NET Web API 和 SignalR 應(yīng)用程序?qū)⒈3植蛔?,因?yàn)檫@些框架可以參與 OWIN 管道。 事實(shí)上,對(duì)于這些類型的應(yīng)用程序,Katana 組件只需使用一個(gè)小的配置類即可見(jiàn)。
      OWIN和Katana并不是一個(gè)全新的開(kāi)發(fā)方式,并不取代 ASP.NET,是實(shí)現(xiàn)Host, Server和Applicantion之間解耦,是一種編寫和托管組件的新方式 。比如使用OWIN方式開(kāi)發(fā)Web API, 我們?nèi)匀贿€是使用Asp.net Web API. 只是Web API變成了我們OWIN管道的一個(gè)組成部分了。正常開(kāi)發(fā)中,我們感覺(jué)不到OWIN的存在,只是在startup代碼中,構(gòu)建我們的OWIN管道。通常,對(duì)于Web API和SignalR這種大型組件,我們都是注冊(cè)在OWIN管道的最后。但是像authentication , cache這樣的組件,我們通常會(huì)注冊(cè)到管道前部。

      二. Katana示例代碼Hello World

      下面的示例是在VS 2013中操作的。

      2.1 使用IIS Host運(yùn)行Hello World

      使用IIS作為宿主,是我們常用的方式。通過(guò)在IIS上建立一個(gè)OWIN管道,運(yùn)行我們的程序。
      首先,在VS2013中,創(chuàng)建一個(gè)新的Asp.net程序。

      owin01

      在彈出框中,選擇Empty模板

      owin02

      從Nuget中添加支持包

      下一步是添加OWIN的支持包。從Tools-> Library Package Manager-> Package Manager Console. 然后在命令窗口中,運(yùn)行install-package Microsoft.Owin.Host.SystemWeb.
      也可以直接在nuget包管理界面上添加

      justrun-blog11

      添加Startup啟動(dòng)類
      Startup類的作用是用來(lái)初始化OWIN管道,這里,我們添加和初始化OWIN管道中的Middleware.

      owin03

      在Startup1.Configuration方法中,添加如下代碼:

      復(fù)制代碼
      public void Configuration(IAppBuilder app)
      {
      // New code:
      app.Run(context =>
      {
      context.Response.ContentType = "text/plain";
      return context.Response.WriteAsync("Hello, world.");
      });
      }
      復(fù)制代碼

      上面的代碼做的事情,就是把一個(gè)簡(jiǎn)單的Middleware注冊(cè)到OWIN管道中。這個(gè)中間件完成的事情非常簡(jiǎn)單: 當(dāng)接受到請(qǐng)求的時(shí)候,輸出Hello World.
      啟動(dòng)程序運(yùn)行,結(jié)果頁(yè)面如下:

      owin05

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

      從IIS Host遷移到自定義Host非常簡(jiǎn)單。使用IIS Host, IIS同時(shí)充當(dāng)了Host和Server的角色。在自定義Host中, 我們將用Console程序作為Host, 同時(shí)用HttpListener來(lái)作為Server,監(jiān)聽(tīng)固定端口發(fā)送的Http請(qǐng)求.
      首先創(chuàng)建一個(gè)簡(jiǎn)單的Console應(yīng)用程序,用Nuget添加Microsoft.Owin.SelfHost

      justrun-blog12

      同樣添加上我們的Startup1.cs, 然后將我們的Console程序改造成Host宿主。

      復(fù)制代碼
      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();
      }
      }
      }
      復(fù)制代碼

      啟動(dòng)程序,然后在瀏覽器中鍵入http://localhost:9000訪問(wèn).
      可以看到,OWIN的應(yīng)用,耦合關(guān)聯(lián)非常少,非常容易地在不同的Host之間遷移。以后在有除IIS外更多優(yōu)秀的Host/Server涌現(xiàn)的時(shí)候,我們的選擇就會(huì)更多

      三. OWIN Startup配置類詳解

      上面我們分別用IIS和Console為宿主,運(yùn)行了一個(gè)簡(jiǎn)單的Hello World程序。雖然只是一個(gè)簡(jiǎn)單的Hello World, 其實(shí)里面包含的內(nèi)容還是挺多的,下面就來(lái)一一介紹。

      3.1 怎么沒(méi)有OWIN規(guī)范中的IDictionary<string, object>和Func<IDictionary<string, object>, Task>?

      上篇文章中,講到OWIN規(guī)范的時(shí)候,提到過(guò)在OWIN管道中傳輸?shù)臄?shù)據(jù)形式是IDictionary<string, object>,但是在我們的代碼中,并沒(méi)有出現(xiàn).

      原因是在微軟的OWIN實(shí)現(xiàn)中,將字典類型包裝到了IOwinContext接口類型中。其實(shí)可以通過(guò)屬性Environment可以訪問(wèn)到該字典,同時(shí)還包裝常用的request, reponse屬性。這樣我們就無(wú)需直接和IDictionary<string, object>打交道, 在OWIN規(guī)范上,字典類型是個(gè)非常好的設(shè)計(jì),簡(jiǎn)單通用,但是在實(shí)際開(kāi)發(fā)中,直接操作字典類型獲取object, 然后再轉(zhuǎn)換類型等畢竟不是一個(gè)直觀和方便的過(guò)程。

      我們的Startup.cs代碼中,下面的context參數(shù)類型,其實(shí)就是IOwinContext.

      app.Run(context => 
      {
      context.Response.ContentType = "text/plain";
      return context.Response.WriteAsync("Hello, world.");
      });

      關(guān)于另外一個(gè)問(wèn)題,Func<IDictionary<string, object>, Task>在哪里?我們來(lái)看看Run函數(shù)的定義就一目了然了:

      public static void Run(this IAppBuilder app, Func<Microsoft.Owin.IOwinContext, System.Threading.Tasks.Task> handler);

      Startup.cs中,主要完成的工作,就是使用IAppBuilder來(lái)注冊(cè)Middleware到OWIN管道中。我們用lambda表達(dá)式注冊(cè)的Hello World, 其實(shí)就是一個(gè)Middleware組件,只是這個(gè)Middleware組件太簡(jiǎn)單了。

      3.2 Host是如何鏈接到Startup類的?

      無(wú)論你使用IIS, IIS Express還是OWIN Host, 微軟在這些Host上實(shí)現(xiàn)的Service都會(huì)依照特定的規(guī)則來(lái)尋找到Startup類,執(zhí)行Configuration方法,注冊(cè)Middleware.

      默認(rèn)名稱匹配
      可以定義Startup.cs類,只要這個(gè)類的namespace和Assembly的名稱相同。那么,這個(gè)Startup.cs中的Configuration方法,就會(huì)在OWIN管道初始化的時(shí)候執(zhí)行。

      使用OwinStartup Attribute
      這就是我們例子中使用的方式,直接指定哪個(gè)具體類是Startup類。

      在配置文件的appSetting 節(jié)點(diǎn)設(shè)置

      <appSettings>
      <add key="owin:appStartup" value="StartupDemo.ProductionStartup" />
      </appSettings>

      通過(guò)上面的講解,希望能幫助大家理解Katana在實(shí)際項(xiàng)目中的使用。
      下一篇中,更加接近實(shí)戰(zhàn),一起看看我們編寫Middleware

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多