代码之家  ›  专栏  ›  技术社区  ›  phougatv

如何以及何时调用/执行OwinStartup类中的配置方法?

  •  14
  • phougatv  · 技术社区  · 9 年前

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

    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

    以下是我的项目的文件夹布局:

    enter image description here
    当前没有控制器或视图。只是 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.Host.SystemWeb
    2. 奥温
    3. 系统
    4. 系统核心


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

    enter image description here


    现在

    1. 为什么?
    2. Owin Startup 在非常基本的项目中初始化(如访问 Home/Index )?
    3. 配置方法如何和何时使用 Owin启动 班级是 调用/执行?


    更新: 2016年12月10日

    检查 Project-Folder-Layout 在里面 引导程序
    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));
            }
        }
    }
    

    现在我要执行 IocConfig.RegisterDependencies() 在里面 OWIN Startup 班我正在做 using Bootstrapper 在里面 Startup 在顶部,但它不起作用。我的意思是,我无法参考 IocConfig 在里面 启动 .如何解决这个问题?

    3 回复  |  直到 9 年前
        1
  •  10
  •   Ivan Sivak    9 年前
    1. 创建一个空的web应用程序项目
    2. 使用NuGet安装OWIN( install-package Microsoft.Owin.Host.SystemWeb )
    3. 在项目根目录中添加一个名为“Startup.cs”的空类

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

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

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

    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 (我猜“首页/索引”指的是MVC),请遵循以下步骤:

    1. 安装MVC NuGet( install-package Microsoft.AspNet.Mvc ).
    2. 将“控制器”文件夹添加到项目中。

    使页面继承自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. 不要忘记注释上面的“.wait ctx.Response.WriteAsync…”中间件。否则会干扰MVC。
    2. 运行项目。应该是有效的。
        2
  •  3
  •   clairestreb    6 年前

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

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

    以下是引导程序项目的属性设置屏幕:

    enter image description here

        3
  •  1
  •   clairestreb    6 年前

    WebApp类使用反射获取指向配置(IAppBuilder)方法的指针,然后调用它。如果作为泛型类型参数提供的类没有包含预期参数的配置方法,则在运行时会出现错误。

    推荐文章