OwinStartup class 中的配置方法如何以及何时是 called/executed?

How and when does Configuration method in OwinStartup class is called/executed?

在我提出问题之前,我已经阅读了以下帖子:

  1. 无法在 IIS Express 中获取 OWIN 启动 class 到 运行 重命名 ASP.NET 项目 file 和问题中提到的所有帖子。
  2. OWIN Startup Detection
  3. OwinStartupAttribute required in web.config to correct Server Error #884
  4. OWIN 启动 class 不 检测到

这是我项目的文件夹布局:


目前没有控制器或视图。只是 Owin Startup 文件。


Startup.cs

using System;
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(Bootstrapper.Startup))]

namespace Bootstrapper
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.Run(async context =>
            {
                await context.Response.WriteAsync(GetTime() + " My First OWIN App");
            });
        }

        string GetTime()
        {
            return DateTime.Now.Millisecond.ToString();
        }
    }
}


Web.config

<appSettings>
    <add key="owin:AutomaticAppStartup" value="true" />
    <add key="owin:appStartup" value="Bootstrapper.Startup" />
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>


我在 Bootstrapper 项目中有以下参考:

  1. Microsoft.Owin
  2. Microsoft.Owin.Host.SystemWeb
  3. 欧文
  4. 系统
  5. System.Core


更新: 忘记添加错误信息:


现在,

  1. 为什么它不起作用?
  2. 在一个非常基本的项目(如访问 Home/Index)中添加和使用 Owin Startup class 的分步过程是什么?
  3. Owin Startup class 中的配置方法如何以及何时进行 called/executed?


更新: 2016 年 12 月 10 日

勾选Project-Folder-Layout。在 Bootstrapper 项目中,我有以下文件:
IocConfig.cs

[assembly: PreApplicationStartMethod(typeof(IocConfig), "RegisterDependencies")]

namespace Bootstrapper
{
    public class IocConfig
    {
        public static void RegisterDependencies()
        {
            var builder = new ContainerBuilder();

            builder.RegisterControllers(typeof(MvcApplication).Assembly);
            builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
            builder.RegisterModule<AutofacWebTypesModule>();

            builder.RegisterType(typeof(MovieService)).As(typeof(IMovieService)).InstancePerRequest();
            builder.RegisterType(typeof(MovieRepository)).As(typeof(IMovieRepository)).InstancePerRequest();

            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        }
    }
}

现在我想在OWIN Startupclass中执行IocConfig.RegisterDependencies()。我在顶部的 Startup 中执行 using Bootstrapper,但是它不起作用。我的意思是我无法在 Startup 中引用 IocConfig。如何解决?

  1. 创建一个空的 Web 应用程序项目
  2. 使用 NuGet 安装 OWIN (install-package Microsoft.Owin.Host.SystemWeb)
  3. 在名为 "Startup.cs"
  4. 的项目根目录中添加一个空的 class

下面我来回答你的第三个问题。 startup class 是 OWIN 的入口点,正在自动查找。如官方文档所述:

Naming Convention: Katana looks for a class named Startup in namespace matching the assembly name or the global namespace.

请注意,您也可以选择自己的启动名称 class,但您必须使用装饰器或 AppConfig 进行设置。如此处所述: https://www.asp.net/aspnet/overview/owin-and-katana/owin-startup-class-detection

这是基本的有效 OWIN 测试所需的一切:

using Owin;
using System;

namespace OwinTest
{
    public class Startup
    {
        public static void Configuration(IAppBuilder app)
        {
            app.Use(async (ctx, next) =>
            {
                await ctx.Response.WriteAsync(DateTime.Now.ToString() + " My First OWIN App");
            });
        }
    }
}

如果您希望使用 MVC(我猜 "Home/Index" 您指的是 MVC),请按照以下步骤操作:

  1. 安装 MVC NuGet(install-package Microsoft.AspNet.Mvc)。
  2. 将 "Controllers" 文件夹添加到您的项目中。
  3. 在新的"Controlles"文件夹下新建一个空控制器(右键->添加->MVC 5控制器-空),命名为"HomeController".
  4. 在新创建的 "Views/Home" 文件夹下创建一个视图页面。右键单击 -> 添加 -> 查看。将其命名为 "Index" 并取消选中 "use layour page".

让页面继承自WebViewPage。它应该看起来像这样:

@inherits System.Web.Mvc.WebViewPage
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div> 
        <h1>Owin Hello</h1>
    </div>
</body>
</html>
  1. 添加一个global.asax来设置路由。右击项目->添加->新建项->全局应用Class.

将路由定义添加到 Application_Start 方法:

protected void Application_Start(object sender, EventArgs e)
{
    RouteTable.Routes.MapRoute(name: "Default",
        url: "{controller}/{action}",
        defaults: new { controller = "Home", action = "Index" });
}
  1. 不要忘记注释掉上面的“..await ctx.Response.WriteAsync...”中间件。否则会干扰 MVC。
  2. 运行 项目。应该工作。

有点晚了,但我找到了如何将 OWIN Startup class 放在单独项目中的解决方案。您在项目中所做的一切都是正确的,您必须只对 Bootstrapper 项目的属性应用一个更改。右键单击 Bootstrapper 项目,进入属性,单击构建选项卡并查找输出路径。您应该看到标准输出路径 bin\debug\,这意味着您的 Bootstrapper dll 将位于此文件夹中。您必须将其更改为整个 Web 应用程序所在的 bin 文件夹。

例如,我创建了一个包含两个项目的简单解决方案,第一个是空的 Web 应用程序,第二个是带有 OWIN Startup class 的库。在第二个项目的属性中,我将输出路径更改为 ..\OwinTest.Web\bin。这将导致所有 dll 在构建后落入一个文件夹中。您现在可以 运行 您的应用,OWIN Startup 应该可以正常工作。

Bootstrapper项目的属性设置画面如下:

The WebApp class uses reflection to get a pointer to the Configuration(IAppBuilder) method then calls it. If the class you provide as the generic type argument does not have a Configuration method with the expected arguments then you get an error at run time.