【问题标题】:How and when does Configuration method in OwinStartup class is called/executed?如何以及何时调用/执行 OwinStartup 类中的 Configuration 方法?
【发布时间】:2016-12-09 12:13:02
【问题描述】:

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

  1. Can't get the OWIN Startup class to run in IIS Express after renaming ASP.NET project file 以及问题中提到的所有帖子。
  2. OWIN Startup Detection
  3. OwinStartupAttribute required in web.config to correct Server Error #884
  4. OWIN Startup class not detected

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


目前没有控制器或视图。只是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. 在一个非常基本的项目中添加和使用Owin Startup 类的分步过程是什么(例如访问Home/Index)?
  3. Owin Startup 类中的配置方法如何以及何时 调用/执行?


更新: 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 Startup 类中执行IocConfig.RegisterDependencies()。我在顶部的Startup 中做using Bootstrapper,但是它不起作用。我的意思是我无法在Startup 中引用IocConfig。如何解决?

【问题讨论】:

    标签: c# asp.net-mvc-4 owin owin-middleware


    【解决方案1】:
    1. 创建一个空的 Web 应用程序项目
    2. 使用 NuGet (install-package Microsoft.Owin.Host.SystemWeb) 安装 OWIN
    3. 在项目根目录中添加一个名为“Startup.cs”的空类

    在这里,我将回答您的第三个问题。启动类是 OWIN 的入口点,正在自动查找。如官方文档所述:

    命名约定:Katana 在命名空间中查找名为 Startup 的类 匹配程序集名称或全局命名空间。

    注意,您也可以选择自己的 Startup 类名称,但您必须使用装饰器或 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 Controller - Empty)并将其命名为“HomeController”。
    4. 在新创建的“Views/Home”文件夹下创建一个视图页面。右键单击-> 添加-> 查看。将其命名为“索引”并取消选中“使用布局页面”。

    使页面继承自 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 以设置路由。右键项目->添加->新建项目->全局应用类。

    将路由定义添加到 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. 运行项目。应该可以工作。

    【讨论】:

    • 如果我不遵守第三点Add an empty class into the project root called "Startup.cs"怎么办?我的意思是我确实添加了一个 Startup 类,但不在根目录中,而是按照我提出的问题进行了操作。查看project-folder-layout 以供参考。
    • @barnes 那么你会得到System.EntryPointNotFoundException 异常。 OWIN 只需要一个入口点。
    • 我从未见过这个异常,相反,在每次调用时,Global.asax 中的Application_Start() 都会被调用。没有抛出异常。后来我将我的Startup 文件移动到项目(Mvc)中,然后它开始执行。
    • 因此,根据您的说法,Owin Startup 文件必须包含在项目根文件夹中,在我的情况下为 Mvc。否则Startup 文件及其方法将不会被执行。对吗?
    • @barnes 您的表示层应该包含一个带有 OWIN 和 MVC 的主 Web 前端。任何额外的业务逻辑或数据层或基础设施都可以是一个单独的服务库。这些附加项目包含代码。在 OWIN 中,您应该始终只调用需要的内容。如果单个 OWIN 中间件本身会变得复杂 - 您始终可以将代码放入单独的类中并仅使用 app.Use&lt;MyClass&gt;() 代替。成功项目的关键始终是简单和干净优雅的代码。关注点分离。
    【解决方案2】:

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

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

    下面是 Bootstrapper 项目的属性设置屏幕:

    【讨论】:

    • 如果我没记错的话,这就是我们所说的引导吗?将 OWIN 启动文件引导到源项目以外的项目?
    • 老实说,我不是很清楚,但我在一个关于什么是引导的问题上找到了这个答案:stackoverflow.com/a/1255796/3872681。基于这个答案,我认为,Web 应用程序中的引导意味着在实际应用程序启动之前加载所有帮助框架,例如 IoC 容器或 ASP.NET Identity 模块,因此 OWIN 本身就是一个引导程序。因此,您将 OWIN 启动文件移动到的项目称为引导程序,因为它包含所有 OWIN 模块,而不是因为您在那里引导 OWIN。但我不是 100% 确定的。
    【解决方案3】:

    WebApp 类使用反射来获取指向 Configuration(IAppBuilder) 方法的指针,然后调用它。如果您作为泛型类型参数提供的类没有带有预期参数的配置方法,那么您在运行时会收到错误。

    【讨论】:

      猜你喜欢
      • 2020-10-28
      • 2017-10-31
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 2013-10-25
      • 2018-11-10
      相关资源
      最近更新 更多