OWIN スタートアップ クラス検出

このチュートリアルでは、読み込まれる OWIN スタートアップ クラスを構成する方法について説明します。 OWIN の詳細については、「 プロジェクト カタナの概要」を参照してください。 このチュートリアルは、Rick Anderson ( @RickAndMSFT )、Praburaj Thiagarajan、および Howard Dierking ( @howard_dierking ) によって作成されました。

必須コンポーネント

Visual Studio 2017

OWIN スタートアップ クラス検出

すべての OWIN アプリケーションには、アプリケーション パイプラインのコンポーネントを指定するスタートアップ クラスがあります。 選択したホスティング モデル (OwinHost、IIS、IIS-Express) に応じて、スタートアップ クラスをランタイムに接続する方法はさまざまです。 このチュートリアルで示すスタートアップ クラスは、すべてのホスティング アプリケーションで使用できます。 次のいずれかの方法を使用して、スタートアップ クラスをホスティング ランタイムに接続します。

  1. 名前付け規則: Katana は、アセンブリ名またはグローバル名前空間に一致する 名前空間で という名前 Startup のクラスを検索します。

  2. OwinStartup 属性: これは、ほとんどの開発者がスタートアップ クラスを指定するために行うアプローチです。 次の属性は、スタートアップ クラスを 名前空間の TestStartup クラスに StartupDemo 設定します。

    [assembly: OwinStartup(typeof(StartupDemo.TestStartup))]
    

    属性は OwinStartup 、名前付け規則をオーバーライドします。 この属性を使用してフレンドリ名を指定することもできますが、フレンドリ名を使用するには、構成ファイルの 要素も使用 appSetting する必要があります。

  3. 構成ファイルの 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>
    

    上記のマークアップは、フレンドリ名を指定し、 クラスを実行する次 OwinStartupProductionStartup2 属性と共に使用する必要があります。

    [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");
                });
            }
        }
    }
    
  4. OWIN スタートアップ検出を無効にするには、web.config ファイルに の"false"値を指定して を追加appSetting owin:AutomaticAppStartupします。

    <add key="owin:AutomaticAppStartup" value="false" />
    

OWIN スタートアップを使用して ASP.NET Web アプリを作成する

  1. 空の Asp.Net Web アプリケーションを作成し、 StartupDemo という名前を付けます。 - NuGet パッケージ マネージャーを使用してインストール Microsoft.Owin.Host.SystemWeb します。 [ツール] メニューの [NuGet パッケージ マネージャー] を選択し、[パッケージ マネージャー コンソール] を選択します。 次のコマンドを入力します。

    Install-Package Microsoft.Owin.Host.SystemWeb
    
  2. OWIN スタートアップ クラスを追加します。 Visual Studio 2017 でプロジェクトを右クリックし、[クラスの 追加] を選択します。- [ 新しい項目の追加 ] ダイアログ ボックスで、検索フィールドに 「OWIN 」と入力し、名前を Startup.cs に変更して、[ 追加] を選択します。

    [新しい項目の追加] ダイアログのスクリーンショット。

    次回 Owin Startup クラスを追加する場合は、[ 追加] メニューから使用できるようになります。

    Owin スタートアップ クラスを追加するための [追加] メニューのスクリーンショット。

    または、プロジェクトを右クリックして [ 追加] を選択し、[ 新しい項目] を選択して、 Owin Startup クラスを選択することもできます。

    [Select the Owin Startup class]\(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 キーを押してアプリケーションを実行します。 数回の更新をヒットします。

    ランタイム アプリケーションのスクリーンショット。

    注: このチュートリアルの画像に表示される番号は、表示される数値と一致しません。 ミリ秒の文字列は、ページを更新するときに新しい応答を表示するために使用されます。 トレース情報は [出力 ]ウィンドウで確認できます。

    出力ウィンドウのスクリーンショット。

その他のスタートアップ クラスを追加する

このセクションでは、別の Startup クラスを追加します。 複数の OWIN スタートアップ クラスをアプリケーションに追加できます。 たとえば、開発、テスト、運用のためのスタートアップ クラスを作成できます。

  1. 新しい OWIN スタートアップ クラスを作成し、 という名前を付けます ProductionStartup

  2. 生成されたコードを次のコードに置き換えます。

    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");
                });
            }
        }
    }
    
  3. Ctrl F5 キーを押してアプリを実行します。 属性は OwinStartup 、運用スタートアップ クラスが実行されていることを指定します。

    運用スタートアップ クラスのスクリーンショット。

  4. 別の OWIN スタートアップ クラスを作成し、 という名前を付けます TestStartup

  5. 生成されたコードを次のコードに置き換えます。

    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");
                });
            }
        }
    }
    

    上記の属性オーバーロードは OwinStartupTestingConfiguration Startup クラスの フレンドリ 名として を指定します。

  6. 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>
    
  7. Ctrl F5 キーを押してアプリを実行します。 アプリ設定要素が優先され、テスト構成が実行されます。

    テスト構成のスクリーンショット。

  8. クラスの 属性からOwinStartupフレンドリ名をTestStartup削除します。

    [assembly: OwinStartup(typeof(StartupDemo.TestStartup))]
    
  9. web.config ファイルの OWIN アプリスタートアップ キーを次のように置き換えます。

    <add key="owin:appStartup" value="StartupDemo.TestStartup" />
    
  10. 各クラスの属性を 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の使用

  1. 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 は を指定します。

  2. PMC から Owinhost をインストールします。

    Install-Package OwinHost
    
  3. アプリケーション フォルダー ( 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
    
  4. URL http://localhost:5000/を使用してブラウザーを起動します。

    localhost URL を使用してブラウザーを起動するスクリーンショット。

    OwinHost は、上記のスタートアップ規則に従いました。

  5. コマンド ウィンドウで Enter キーを押して OwinHost を終了します。

  6. クラスに ProductionStartupProductionConfiguration のフレンドリ名を指定する次の OwinStartup 属性を追加します。

    [assembly: OwinStartup("ProductionConfiguration", 
               typeof(StartupDemo.ProductionStartup))]
    
  7. コマンド プロンプトで、次のように入力します。

    ..\packages\OwinHost.2.0.0\tools\OwinHost.exe ProductionConfiguration
    

    運用スタートアップ クラスが読み込まれます。 運用スタートアップ クラスのスクリーンショット。

    アプリケーションには複数のスタートアップ クラスがあり、この例では、ランタイムまで読み込むスタートアップ クラスを延期しています。

  8. 次のランタイム スタートアップ オプションをテストします。

    ..\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"