每個OWIN應用程序都有一個啟動類,可以在這個類里為應用程序管道指定組件。有不同的方式可以將啟動類與運行時關聯起來,這依賴於選擇的托管模型(OwinHost,IIS,IIS-Express)。本教程中的啟動類可以用在每個托管的程序中。可以使用下面這些方法中的一種將啟動類與運行時進行關聯。
- 命名約定:Katana在匹配的程序集或全局命名空間中查找名為Startup的類。
- OwinStartup特性:大多數開發人員使用這種方法指定啟動類。下面的特性設置StartupDemo命名空間中的TestStartup類為啟動類。
[assembly: OwinStartup(typeof(StartupDemo.TestStartup))]
OwinStartup特性重寫了命名約定。可以使用這個特性指定一個友好的名字,然而,使用友好的名字還需要使用配置文件的appSetting元素。
- 配置文件的appSetting:appSetting元素重寫了OwinStartup特性和命名約定。可以有多個啟動類(每個使用OwinStartup特性),在配置文件中使用類似於下面的標記配置哪個啟動類被加載。
<appSettings> <add key="owin:appStartup" value="StartupDemo.ProductionStartup" /> </appSettings>
也可以顯示指定啟動類和程序集:
<add key="owin:appStartup" value="StartupDemo.ProductionStartup, StartupDemo" />
下面的XML指定了一個名為ProductionConfiguration的友好的啟動類名稱:
<appSettings> <add key="owin:appStartup" value="ProductionConfiguration" /> </appSettings>
上面的標記必須和下面的OwinStartup特性一起使用來引起ProductionStartup2類運行。
[assembly: OwinStartup("ProductionConfiguration",typeof(StartupDemo.ProductionStartup2))] namespace StartupDemo { public class ProductionStartup { public void Configuration(IAppBuilder app) { app.Run(context => { string t = DateTime.Now.Millisecond.ToString(); return context.Response.WriteAsync(t + " Production OWIN App"); }); } } public class ProductionStartup2 { public void Configuration(IAppBuilder app) { app.Run(context => { string t = DateTime.Now.Millisecond.ToString(); return context.Response.WriteAsync(t + " 2nd Production OWIN App"); }); } } }
- 設置appSetting的owin:AutomaticAppStartup值為false禁用OWIN啟動發現:
<add key="owin:AutomaticAppStartup " value="false" />
使用OWIN Startup創建 ASP.NET Web App
- 創建一個空的ASP.NET web程序,命名為StartupDemo。
- 使用NuGet程序包管理器安裝Microsoft.Owin.Host.SystemWeb。
Install-Package Microsoft.Owin.Host.SystemWeb
- 添加一個OWIN啟動類。Visual Studio 2013中,在項目上右擊,選擇添加類。
- 彈出添加新項對話框,在搜索框中輸入OWIN,更改名字為Startup.cs,然后點擊添加。
下次再添加OWIN Startup類的時候,就可以直接從添加菜單中添加了。
也可以右擊項目,選擇添加,然后選擇新建項,然后選擇Owin Startup類。
5.將Startup.cs文件替換成如下代碼:
using System; using System.Threading.Tasks; using Microsoft.Owin; using Owin; using System.IO; //[assembly: OwinStartup(typeof(StartupDemo.Startup))] namespace StartupDemo { public class Startup { public void Configuration(IAppBuilder app) { app.Use((context, next) => { TextWriter output = context.Get<TextWriter>("host.TraceOutput"); return next().ContinueWith(result => { output.WriteLine("Scheme {0} : Method {1} : Path {2} : MS {3}", context.Request.Scheme, context.Request.Method, context.Request.Path, getTime()); }); }); app.Run(async context => { await context.Response.WriteAsync(getTime() + " My First OWIN App"); }); } string getTime() { return DateTime.Now.Millisecond.ToString(); } } }
app.Use拉姆達表達式注冊指定的中間件到OWIN管道。在這個例子中,我們在響應傳入請求前建立傳入請求的日志記錄。next參數是管道中下一個組件的委托。app.Run拉姆達表達式將管道掛鈎到傳入請求並提供響應機制。注意:在上面的代碼,注釋掉了OwinStartup特性,我們依賴於運行名為Startup的類這一約定。
6.按F5運行程序。多刷新幾次試試。
注意:上圖中你看到的數字可能跟你的不一樣。當你刷新頁面時,使用毫秒字符串來顯示一個新的響應。你可以在輸出窗口看到跟蹤信息。
添加更多啟動類
本節,將添加另外一個啟動類。可以在一個程序中添加多個OWIN啟動類。比如,你可能想創建用於開發的啟動類、測試的啟動類和生產的啟動類。
- 創建一個OWIN Startup類,命名為ProductionStartup。
- 使用下面的代碼替換。
[assembly: OwinStartup(typeof(StartupDemo.ProductionStartup))] namespace StartupDemo { public class ProductionStartup { public void Configuration(IAppBuilder app) { app.Run(context => { string t = DateTime.Now.Millisecond.ToString(); return context.Response.WriteAsync(t + " Production OWIN App"); }); } } }
- 按Ctrl+F5運行程序。OwinStartup特性指定production startup類運行。
- 創建另一個OWIN Startup類,命名為TestStartup。
- 使用下面的代碼替換。
[assembly: OwinStartup("TestingConfiguration", typeof(StartupDemo.TestStartup))] namespace StartupDemo { public class TestStartup { public void Configuration(IAppBuilder app) { app.Run(context => { string t = DateTime.Now.Millisecond.ToString(); return context.Response.WriteAsync(t + " Test OWIN App"); }); } } }
OwinStartup特性重載指定TestingConfiguration作為Startup類的友好名稱。
- 打開web.config文件,添加OWIN App startup鍵指定Startup類的友好名稱。
<appSettings> <add key="owin:appStartup" value="TestingConfiguration" /> </appSettings>
- 按Ctrl+F5運行程序。app settings元素優先,test configuration運行。
8. 從TestStartup類的OwinStartup特性上移除友好名稱。
[assembly: OwinStartup(typeof(StartupDemo.TestStartup))]
在web.config文件中修改OWIN App startup鍵入如下:
<addkey="owin:appStartup"value="StartupDemo.TestStartup"/>
10. 恢復每個類的OwinStartup到Visual Studio生成的默認特性。
[assembly: OwinStartup(typeof(StartupDemo.Startup))] [assembly: OwinStartup(typeof(StartupDemo.ProductionStartup))] [assembly: OwinStartup(typeof(StartupDemo.TestStartup))]
11. 下面的每一個OWIN App startup鍵都會引起production類運行。
<addkey="owin:appStartup"value="StartupDemo.ProductionStartup"/> <addkey="owin:appStartup"value="StartupDemo.ProductionStartup, StartupDemo"/> <addkey="owin:appStartup"value="StartupDemo.ProductionStartup.Configuration, StartupDemo"/>
12.最后一個startup鍵指定startup的配置方法。下面的OWIN App startup鍵允許修改Configuration方法名為MyConfiguration。
<addkey="owin:appStartup"value="StartupDemo.ProductionStartup2.MyConfiguration"/>
使用Owinhost.exe
- 使用下面的標記替換web.config文件的appSettings。
<appSettings> <add key="owin:appStartup" value="StartupDemo.Startup" /> <add key="owin:appStartup" value="StartupDemo.TestStartup" /> </appSettings>
最后一個鍵勝出,所以本例中TestStartup被指定。
- 從PMC中安裝Owinhost
Install-Package OwinHost
- 導航到程序文件夾(包含web.config的文件夾),按住Shift鍵右擊,選擇“在此處打開命令窗口”。
- 在命令窗口中,鍵入以下命令:
..\packages\Owinhost<Version>\tools\Owinhost.exe
命令窗口顯示如下:
- 啟動瀏覽器,輸入地址:http://localhost:5000/
OwinHost遵循上面列出的約定。 - 在命令窗口中,按回車鍵退出OwinHost。
- 在ProductionStartup類中,添加下面的OwinStartup特性,並指定一個友好的名稱:ProductionConfiguration,(不要忘記編譯項目)。
[assembly: OwinStartup("ProductionConfiguration",typeof(StartupDemo.ProductionStartup))]
- 在命令窗口中鍵入:
..\packages\Owinhost.2.1.0\tools\Owinhost.exe ProductionConfiguration
Production啟動類被加載。
我們的程序有多個啟動類,在這個例子中,哪個啟動類被加載推遲到了運行時。 - 測試下面的運行時啟動項:
..\packages\Owinhost.2.1.0\tools\Owinhost.exe StartupDemo.TestStartup ..\packages\Owinhost.2.1.0\tools\Owinhost.exe "StartupDemo.TestStartup,StartupDemo" ..\packages\Owinhost.2.1.0\tools\Owinhost.exe StartupDemo.TestStartup.Configuration ..\packages\Owinhost.2.1.0\tools\Owinhost.exe"StartupDemo.TestStartup.Configuration,StartupDemo"