[ASP.NET] 下一代ASP.NET開發規範:OWIN

今天投簡歷 準備面試了...html

 

本節目錄:面試

 

OWIN簡介架構

OWIN(Open Web Interface For .Net)併發

OWIN是.Net開源社區借鑑Ruby而制定的.Net Web開發架構,有着很是簡單的規範定義,目標是用於解耦Web Server和Web Application.app

 

ASP.NET的侷限性asp.net

ASP.NET核心是System.Web,而System.Web緊耦合IIS.IIS綁定在Windows OS上,因此ASP.NET 沒法跨平臺.ide

System.Web是.NET Framework重要組成,因此System.Web更新須要等待.NET的發佈ui

 

OWIN規範spa

OWIN定義了4層:.net

2

Host:主要負責應用程序的配置和啓動進程,包括初始化OWIN Pipeline、運行Server。

Server:綁定套接字並監聽的HTTP請求而後將Request和Response的Body、Header封裝成符合OWIN規範的字典併發送到OWIN Middleware Pipeline中

Middleware:稱之爲中間件、組件,位於Server與Application之間,用來處理髮送到Pipeline中的請求

Application:這是具體的應用程序代碼,只不過咱們將他們註冊到OWIN Pipeline中去處理HTTP 請求,成爲OWIN管道的一部分

 

OWIN接口

Func<IDictionary<string, object>, Task>;

用於Server和Middleware的交互。他並非嚴格意義上的接口,而是一個委託而且每一個OWIN中間件組件必須提供。

其中參數類型爲IDictionary<string,object>的變量爲環境變量

 

Katana

微軟引入並推廣OWIN,同時依照OWIN規範,實現了Katana。

 

Host

宿主只是一個進程,是整個OWIN程序的載體。這個宿主能夠是IIS, IIS Express, Console, Windows Service等。

Katana爲咱們提供了3中選擇:

  • IIS / ASP.NET :使用IIS是最簡單和向後兼容方式,在這種場景中OWIN Pipeline經過標準的HttpModule和HttpHandler啓動。使用此Host你必須使用System.Web做爲OWIN Server
  • Self-Host :若是你想要使用其餘Server來替換掉System.Web,而且能夠有更多的控制權,能夠選擇建立一個自定義宿主,如使用Windows Service、控制檯應用程序、Winform來承載Server
  • OwinHost :也可使用Katana提供的OwinHost.exe:他是一個命令行應用程序,運行在項目的根部,啓動HttpListener Server並找到基於約束的Startup啓動項

 

Server

負責綁定到 TCP 端口,監聽端口發送過來的請求,同時將請求的信息依照OWIN規範,包裝成字典格式,傳遞到下層的Middleware

Katana對OWIN Server的實現分爲以下幾類:

  • System.Web:當使用IIS做爲Host時,System.Web把本身註冊爲HttpModule和HttpHandler而且處理髮送給IIS的請求(Microsoft.Owin.Host.SystemWeb)
  • HttpListener:這是OwinHost.exe和自定義Host默認的Server。(Microsoft.Owin.Host.HttpListener)
  • WebListener:這是ASP.NET vNext默認的輕量級Server,他目前沒法使用在Katana中

 

Middleware

這是爲組成 OWIN 管道中的組件。

Middleware能夠理解爲提供Func<IDictionary<string, object>, Task>接口的組件。

Katana提供了一個OwinMiddleware基類更加方便咱們繼承來實現OWIN Middleware.

 

Application

具體的代碼實現,好比ASP.NET Web API、SignalR具體代碼的實現。

事實上,對於這些類型的應用程序,Katana 組件只需使用一個小的配置類便可見。

 

 

Hello World

IIS-Host

新建一個空的Web項目,Nuget引用Microsoft.Owin.Host.SystemWeb

 

建立Startup類

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.Run(context =>
            {
                context.Response.ContentType = "text/plain";
                return context.Response.WriteAsync("Hello World!");
            });
        }
    }

訪問項目地址:http://localhost:xx

 

Self-Host

新建控制檯項目,Nuget引用Microsoft.Owin.SelfHost

Main方法

using (WebApp.Start<Startup>("http://localhost:12345"))
{
    Console.ReadLine();
}

建立Startup類

    class Startup
    {
        public void Configuration(IAppBuilder app)
        {
#if DEBUG
            //診斷
            app.UseErrorPage();
#endif
            //歡迎頁
            //app.UseWelcomePage("/");
            app.Run(x=>x.Response.WriteAsync("hello world"));
        }
    }

訪問地址:http://localhost:12345

 

OWIN-Host

新建類庫項目,Nuget引用OwinHost

 

建立Startup類(須要程序集Owin和Microsoft.Owin)

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.Run(context =>
            {
                context.Response.ContentType = "text/plain";
                return context.Response.WriteAsync("Hello World!");
            });
        }
    }

 

OwinHost.exe

這裏須要注意

  1. Nuget下載完,OwinHost.exe會在package文件夾裏
  2. OwinHost.exe會加載./bin文件夾下的程序集做爲server assembly

因此咱們將這OwinHost.exe3個文件移動到

=>

另外將Debug或者Release文件夾下的文件移動到bin文件夾下

 

cmd運行OwinHost.exe

訪問:http://localhost:5000/

 

 

自定義Middleware

Middleware很是相似於HttpModule,會註冊到Owin的pipeline中執行代碼.

 

繼承OwinMiddleware

    public class HelloMiddlerware : OwinMiddleware
    {
        public HelloMiddlerware(OwinMiddleware next)
            : base(next)
        {
        }

        public override Task Invoke(IOwinContext context)
        {
            context.Response.Write("hello"+DateTime.Now);
        //管道繼續往下走 return Next.Invoke(context); } }

Startup

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // 有關如何配置應用程序的詳細信息,請訪問 http://go.microsoft.com/fwlink/?LinkID=316888
            //管線自由組合
            app.Use<HelloMiddlerware>();
            //Run是插入一箇中間件,並終止繼續往下流
            app.Run(x => x.Response.WriteAsync("good"));
            //此中間件將不執行
            app.Use<HelloMiddlerware>();
        }
    }

 

來看一下組件的執行順序

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.Use((x, next) =>
            {
                x.Response.ContentType = "text/html";
                return next.Invoke();
            });
            app.Use((x, next) =>
            {
                x.Response.WriteAsync("1 Before");
                next.Invoke();
                return x.Response.WriteAsync("1 After");
            });
            app.Use((x, next) =>
            {
                x.Response.WriteAsync("2 Before");
                next.Invoke();
                return x.Response.WriteAsync("2 After");
            });
            app.Run(x => x.Response.WriteAsync("<br/>hello world<br/>"));
        }
    }

瀏覽結果:

 

 

 

擴展

Startup類如何被關聯

1.默認名稱匹配
能夠定義Startup.cs類,只要這個類的namespace和Assembly的名稱相同。那麼,這個Startup.cs中的Configuration方法,就會在OWIN管道初始化的時候執行。

 

2.使用OwinStartup Attribute
這就是咱們例子中使用的方式,直接指定哪一個具體類是Startup類。

 

3.在配置文件的appSetting 節點設置

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

 

 

Pipeline

Owin的pipeline在IIS Host上本質是註冊到Httpapplication的pipeline上.

如:app.UseStageMarker(PipelineStage.Authenticate);

 

 

本文參考:

http://www.cnblogs.com/JustRun1983/p/3955238.html

Katana:http://www.asp.net/aspnet/overview/owin-and-katana/an-overview-of-project-katana

相關文章
相關標籤/搜索