このチュートリアルでは、どの OWIN スタートアップ クラスが読み込まれるかを構成する方法について説明します。 OWIN の詳細については、「プロジェクト Katana の概要」を参照してください。 このチュートリアルは、Rick Anderson (@RickAndMSFT)、Praburaj Thiagarajan、および Howard Dierking (@howard_dierking) によって記述されました。
前提条件
OWIN スタートアップ クラス検出
どの 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"); }); } } }
OWIN スタートアップ検出を無効にするには、
"false"
値を指定したappSetting owin:AutomaticAppStartup
を web.config ファイルに追加します。<add key="owin:AutomaticAppStartup" value="false" />
OWIN スタートアップを使用して ASP.NET Web アプリを作成する
空の Asp.Net Web アプリケーションを作成し、StartupDemo という名前を付けます。 - NuGet パッケージ マネージャーを使用して
Microsoft.Owin.Host.SystemWeb
をインストールします。 [ツール] メニューで、[NuGet パッケージ マネージャー]、[パッケージ マネージャー コンソール] の順に選択します。 次のコマンドを入力します。Install-Package Microsoft.Owin.Host.SystemWeb
OWIN スタートアップ クラスを追加します。 Visual Studio 2017 でプロジェクトを右クリックし、[クラスの追加] を選択します。- [新しい項目の追加] ダイアログ ボックスで、検索フィールドに「OWIN」と入力し、名前を Startup.cs に変更して、[追加] を選択します。
次回 "Owin スタートアップ クラス" を追加するときには、[追加] メニューから使用できるようになります。
または、プロジェクトを右クリックして [追加] を選択し、[新しい項目] を選択してから [Owin スタートアップ クラス] を選択することもできます。
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
パラメーターは、パイプライン内の次のコンポーネントへのデリゲート (Func<Task>) です。app.Run
ラムダ式は、パイプラインを受信要求にフックし、応答メカニズムを提供します。Note
上記のコードでは、
OwinStartup
属性をコメントアウトし、Startup
という名前のクラスの実行の規則に依存しています。- F5 キーを押してアプリケーションを実行します。 数回更新します。注: このチュートリアルの画像に表示されている数値は、実際に表示される数値と一致しません。 ミリ秒の文字列は、ページを更新したときの新しい応答を示すために使用されています。 トレース情報は [出力] ウィンドウで確認できます。
他のスタートアップ クラスを追加する
このセクションでは、別のスタートアップ クラスを追加します。 複数の OWIN スタートアップ クラスをアプリケーションに追加できます。 たとえば、開発、テスト、運用のためのスタートアップ クラスを作成できます。
新しい OWIN スタートアップ クラスを作成し、
ProductionStartup
という名前を付けます。生成されたコードを次のコードに置き換えます。
using System; using System.Threading.Tasks; using Microsoft.Owin; using Owin; [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
属性は、運用スタートアップ クラスが実行されることを指定します。別の OWIN スタートアップ クラスを作成し、
TestStartup
という名前を付けます。生成されたコードを次のコードに置き換えます。
using System; using System.Threading.Tasks; using Microsoft.Owin; using Owin; [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
をスタートアップ クラスの "フレンドリ" 名として指定します。web.config ファイルを開き、スタートアップ クラスのフレンドリ名を指定する OWIN アプリのスタートアップ キーを追加します。
<?xml version="1.0" encoding="utf-8"?> <configuration> <appSettings> <add key="owin:appStartup" value="TestingConfiguration" /> </appSettings> <system.web> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> </system.web> </configuration>
Ctrl キーを押しながら F5 キーを押して、アプリを実行します。 アプリ設定要素が優先され、テスト構成が実行されます。
TestStartup
クラスのOwinStartup
属性から "フレンドリ" 名を削除します。[assembly: OwinStartup(typeof(StartupDemo.TestStartup))]
web.config ファイル内の OWIN アプリのスタートアップ キーを以下で置き換えます。
<add key="owin:appStartup" value="StartupDemo.TestStartup" />
各クラスの
OwinStartup
属性を、Visual Studio によって生成された既定の属性コードに戻します。[assembly: OwinStartup(typeof(StartupDemo.Startup))] [assembly: OwinStartup(typeof(StartupDemo.ProductionStartup))] [assembly: OwinStartup(typeof(StartupDemo.TestStartup))]
以下の OWIN アプリのスタートアップ キーはそれぞれ、運用クラスを実行します。
<add key="owin:appStartup" value="StartupDemo.ProductionStartup" /> <add key="owin:appStartup" value="StartupDemo.ProductionStartup, StartupDemo" /> <add key="owin:appStartup" value="StartupDemo.ProductionStartup.Configuration, StartupDemo" />
最後のスタートアップ キーは、スタートアップ構成方法を指定します。 次の OWIN アプリ スタートアップ キーを使用すると、構成クラスの名前を
MyConfiguration
に変更できます。<add key="owin:appStartup" value="StartupDemo.ProductionStartup2.MyConfiguration" />
Owinhost.exe の使用
Web.config ファイルを次のマークアップに置き換えます。
<?xml version="1.0" encoding="utf-8"?> <configuration> <appSettings> <add key="owin:appStartup" value="StartupDemo.Startup" /> <add key="owin:appStartup" value="StartupDemo.TestStartup" /> </appSettings> <system.web> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> </system.web> </configuration>
最後のキーが優先されるため、この場合は
TestStartup
が指定されます。PMC から Owinhost をインストールします。
Install-Package OwinHost
アプリケーション フォルダー (Web.config ファイルを含むフォルダー) に移動し、コマンド プロンプトで次のように入力します。
..\packages\Owinhost<Version>\tools\Owinhost.exe
コマンド ウィンドウに次の情報が表示されます。
C:\StartupDemo\StartupDemo>..\packages\OwinHost.2.0.0\tools\Owin Host.exe Starting with the default port: 5000 (http://localhost:5000/) Started successfully Press Enter to exit
URL
http://localhost:5000/
を使用してブラウザーを起動します。OwinHost は、上記のスタートアップ規則に従っています。
コマンド ウィンドウで、Enter キーを押して OwinHost を終了します。
ProductionStartup
クラスに、ProductionConfiguration のフレンドリ名を指定する次の OwinStartup 属性を追加します。[assembly: OwinStartup("ProductionConfiguration", typeof(StartupDemo.ProductionStartup))]
コマンド プロンプトで、次のように入力します。
..\packages\OwinHost.2.0.0\tools\OwinHost.exe ProductionConfiguration
運用スタートアップ クラスが読み込まれます。
アプリケーションには複数のスタートアップ クラスがあり、この例では、読み込むスタートアップ クラスを実行時まで遅延しました。
次のランタイム スタートアップ オプションをテストします。
..\packages\OwinHost.2.0.0-rc1\tools\OwinHost.exe StartupDemo.TestStartup ..\packages\OwinHost.2.0.0-rc1\tools\OwinHost.exe "StartupDemo.TestStartup,StartupDemo" ..\packages\OwinHost.2.0.0-rc1\tools\OwinHost.exe StartupDemo.TestStartup.Configuration ..\packages\OwinHost.2.0.0-rc1\tools\OwinHost.exe "StartupDemo.TestStartup.Configuration,StartupDemo"