OWIN 啟動類別偵測

本教學課程說明如何設定載入哪個 OWIN 啟動類別。 如需 OWIN 的詳細資訊,請參閱 Project Katana 概觀。 本教學課程是由 Rick Anderson ( @RickAndMSFT ) 、Prabu) 和 Howard Dierking ( @howard_dierking ) 所撰寫。

必要條件

Visual Studio 2017

OWIN 啟動類別偵測

每個 OWIN 應用程式都有一個啟動類別,您可以在其中指定應用程式管線的元件。 根據您選擇的裝載模型,您可以使用不同的方式將啟動類別與執行時間連線, (OwinHost、IIS 和 IIS-Express) 。 本教學課程中顯示的啟動類別可用於每個裝載應用程式。 您可以使用下列其中一種方法,將啟動類別與裝載執行時間連線:

  1. 命名慣例:在命名空間中尋找名為 Startup 的類別,符合元件名稱或全域命名空間。

  2. OwinStartup 屬性:這是大部分開發人員將採用以指定啟動類別的方法。 下列屬性會將啟動類別設定為 TestStartup 命名空間中的 StartupDemo 類別。

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

    屬性 OwinStartup 會覆寫命名慣例。 您也可以使用這個屬性來指定易記名稱,不過,使用易記名稱時,您也需要在 appSetting 組態檔中使用 元素。

  3. 組態檔中的 appSetting 元素:元素 appSettingOwinStartup 覆寫屬性和命名慣例。 您可以使用屬性) 來 (多個啟動類別 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 啟動探索, appSetting owin:AutomaticAppStartup 請在 web.config 檔案中新增 值 "false"

    <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 啟動] 類別

    選取 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.UseLambda 運算式可用來向 OWIN 管線註冊指定的中介軟體元件。 在此情況下,我們會先設定傳入要求的記錄,再回應傳入要求。 參數 next 是管線中下一個元件的委派 ( Func<Task> ) 。 app.RunLambda 運算式會將管線連結至傳入要求,並提供回應機制。

    注意

    在上述程式碼中,我們已將 屬性批註化 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. 按 Control 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");
                });
            }
        }
    }
    

    OwinStartup上述屬性多載會 TestingConfiguration 指定為 Startup 類別的易記名稱。

  6. 開啟 web.config 檔案,並新增 OWIN 應用程式啟動金鑰,以指定 Startup 類別的易記名稱:

    <?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. 按 Control 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. ProductionStartup 類別中,新增下列 OwinStartup 屬性,以指定 ProductionConfiguration的易記名稱。

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