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

Ved*_*ant 11 c# asp.net-mvc-4 owin owin-middleware

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

  1. 重命名ASP.NET项目文件和问题中提到的所有帖子后,无法让OWIN Startup类在IIS Express中运行.
  2. OWIN启动检测
  3. web.config中需要OwinStartupAttribute以更正服务器错误#884
  4. 未检测到OWIN启动类

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

在此输入图像描述
目前没有控制器或视图.只是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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


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>
Run Code Online (Sandbox Code Playgroud)


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

  1. Microsoft.Owin
  2. Microsoft.Owin.Host.SystemWeb
  3. Owin
  4. 系统
  5. System.Core程序


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

在此输入图像描述


现在,

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


更新: 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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想IocConfig.RegisterDependencies()OWIN Startup课堂上执行.我在顶部做using Bootstrapper,Startup但它不起作用.我的意思是我无法引用IocConfigStartup.怎么解决这个?

Iva*_*vak 6

  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");
            });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你想使用MVC(我想通过"Home/Index"你的意思是MVC),请按照下列步骤操作:

  1. 安装MVC NuGet(install-package Microsoft.AspNet.Mvc).
  2. 在项目中添加"Controllers"文件夹.
  3. 在新的"Controlles"文件夹下创建一个新的空控制器(右键单击 - > add - > MVC 5 Controller - Empty)并将其命名为"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>
Run Code Online (Sandbox Code Playgroud)
  1. 添加a 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" });
}
Run Code Online (Sandbox Code Playgroud)
  1. 别忘了注释掉上面的"..await ctx.Response.WriteAsync ..."中间件.否则会干扰MVC.
  2. 运行该项目.应该工作.

  • @barnes您的表示层应包含一个带有OWIN和MVC的主Web前端.任何其他业务逻辑或数据层或基础结构都可以是单独的服务库.这些附加项目包含代码.在OWIN内部,您应始终只调用所需的内容.如果单个OWIN中间件本身会变得复杂 - 你总是可以将代码放入单独的类中,而只使用`app.Use <MyClass>()`.成功项目的关键始终是简洁,干净优雅的代码.关注点分离. (2认同)