OWIN 启动类检测

本教程演示如何配置加载的 OWIN 启动类。 有关 OWIN 的详细信息,请参阅 Project Katana 概述。 本教程由 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>
    

    上述标记必须与以下 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 Startup”类

    选择 Owin Startup 类的屏幕截图。

  • 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();
          }
       }
    }
    

    lambda app.Use 表达式用于将指定的中间件组件注册到 OWIN 管道。 在这种情况下,我们将在响应传入请求之前设置传入请求的日志记录。 参数 next ( Func<Task> ) 到管道中下一个组件的委托。 app.Run lambda 表达式将管道与传入请求挂钩,并提供响应机制。

    注意

    在上面的代码中,我们已注释掉 OwinStartup 属性,并依赖于运行名为 Startup 的类的约定。- 按 F5 运行应用程序。 点击刷新几次。

    运行时应用程序的屏幕截图。

    注意:本教程中图像中显示的数字与你看到的数字不匹配。 毫秒字符串用于显示刷新页面时的新响应。 可以在“ 输出 ”窗口中查看跟踪信息。

    输出窗口的屏幕截图。

添加更多启动类

在本部分中,我们将添加另一个 Startup 类。 可以将多个 OWIN 启动类添加到应用程序。 例如,你可能想要创建用于开发、测试和生产的启动类。

  1. 创建新的 OWIN Startup 类并将其命名为 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 Startup 类并将其命名为 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. 从 类中的 OwinStartupTestStartup 属性中删除友好名称。

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