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

时间:2016-12-09 12:13:02

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

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

  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
  5. 这是我项目的文件夹布局:

    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
    2. Microsoft.Owin.Host.SystemWeb
    3. Owin
    4. 系统
    5. System.Core程序

    6. 更新: 忘了添加错误信息:

      enter image description here


      现在,

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

      4. 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));
                }
            }
        }
        

        现在我想在IocConfig.RegisterDependencies()课程中执行OWIN Startup。我在顶部的using Bootstrapper中正在Startup但是,它无效。我的意思是我无法在IocConfig中引用Startup。如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

  1. 创建一个空的Web应用程序项目
  2. 使用NuGet(install-package Microsoft.Owin.Host.SystemWeb
  3. 安装OWIN
  4. 将空类添加到名为&#34; Startup.cs&#34;
  5. 的项目根目录中

    我将在此回答您的第三个问题。启动类是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 (我想通过&#34; Home / Index&#34;你的意思是MVC),请按照以下步骤操作:

    1. 安装MVC NuGet(install-package Microsoft.AspNet.Mvc)。
    2. 添加&#34;控制器&#34;文件夹进入你的项目。
    3. 在新的&#34;控件&#34;下创建一个新的空控制器。文件夹(右键单击 - &gt;添加 - &gt; MVC 5控制器 - 空)并将其命名为&#34; HomeController&#34;。
    4. 在新创建的&#34; Views / Home&#34;下创建一个视图页面。夹。右键单击 - &gt;添加 - &gt;视图。将其命名为&#34;索引&#34;并取消选中&#34;使用layour页面&#34;。
    5. 使页面继承自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以设置路线。右键单击项目 - &gt;添加 - &gt;新商品 - &gt;全球应用类。
      2. 将路由定义添加到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. 不要忘记评论上面的内容&#34; ..等待ctx.Response.WriteAsync ...&#34;中间件。否则会干扰MVC。
        2. 运行项目。应该工作。

答案 1 :(得分:0)

有点晚了,但我找到了解决方法如何将OWIN Startup类放在单独的项目中。您在项目中完成的所有操作都是正确的,您只能在Bootstrapper项目的属性中应用一个更改。右键单击Bootstrapper项目,输入属性,单击Build选项卡并查找Output path。您应该看到标准输出补丁bin \ debug \,这意味着您的Bootstrapper dll将落在此文件夹中。您必须将其更改为整个Web应用程序所在的bin文件夹。

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

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

enter image description here