次の方法で共有


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

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

前提条件

Visual Studio 2017

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

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

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

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

    [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>
    

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

    <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 に変更して、[追加] を選択します。

    Screenshot of Add new item dialog.

    次回 "Owin スタートアップ クラス" を追加するときには、[追加] メニューから使用できるようになります。

    Screenshot of Add menu to add an Owin startup class.

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

    Screenshot of Select the Owin Startup class.

  • 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 キーを押してアプリケーションを実行します。 数回更新します。

    Screenshot of the runtime application.

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

    Screenshot of the output window.

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

このセクションでは、別のスタートアップ クラスを追加します。 複数の 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 属性は、運用スタートアップ クラスが実行されることを指定します。

    Screenshot of production startup class.

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

    上記の OwinStartup 属性オーバーロードは、TestingConfiguration をスタートアップ クラスの "フレンドリ" 名として指定します。

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

    Screenshot of test configuration.

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

    [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/ を使用してブラウザーを起動します。

    Screenshot of launching a browser with the localhost URL.

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

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

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

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

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

    運用スタートアップ クラスが読み込まれます。 Screenshot of Production startup class.

    アプリケーションには複数のスタートアップ クラスがあり、この例では、読み込むスタートアップ クラスを実行時まで遅延しました。

  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"