今天投簡歷 準備面試了...html
本節目錄:面試
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定義了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>的變量爲環境變量
微軟引入並推廣OWIN,同時依照OWIN規範,實現了Katana。
Host
宿主只是一個進程,是整個OWIN程序的載體。這個宿主能夠是IIS, IIS Express, Console, Windows Service等。
Katana爲咱們提供了3中選擇:
Server
負責綁定到 TCP 端口,監聽端口發送過來的請求,同時將請求的信息依照OWIN規範,包裝成字典格式,傳遞到下層的Middleware
Katana對OWIN Server的實現分爲以下幾類:
Middleware
這是爲組成 OWIN 管道中的組件。
Middleware能夠理解爲提供Func<IDictionary<string, object>, Task>接口的組件。
Katana提供了一個OwinMiddleware基類更加方便咱們繼承來實現OWIN Middleware.
Application
具體的代碼實現,好比ASP.NET Web API、SignalR具體代碼的實現。
事實上,對於這些類型的應用程序,Katana 組件只需使用一個小的配置類便可見。
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
這裏須要注意
因此咱們將這OwinHost.exe3個文件移動到
=>
另外將Debug或者Release文件夾下的文件移動到bin文件夾下
cmd運行OwinHost.exe
訪問:http://localhost:5000/
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