如何调用OwinStartup属性引用的类?

时间:2014-09-02 01:52:51

标签: c# startup owin

如果添加属性,则为OWIN添加nuget包之后:

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

然后是MyProject.Startup类的方法

public void Configuration(IAppBuilder app)

被调用。怎么称呼? web.config中对OWIN的唯一引用是程序集绑定重定向。我的项目中没有其他引用可以导致识别此属性的http模块。如果我查看堆栈跟踪,我会看到这些行:

Microsoft.Owin.Host.SystemWeb.dll!Microsoft.Owin.Host.SystemWeb.OwinHttpModule.Init(System.Web.HttpApplication context) Unknown
System.Web.dll!System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(System.IntPtr appContext, System.Web.HttpContext context, System.Reflection.MethodInfo[] handlers)  Unknown

这表明OWIN已经注册为IIS的事件订阅,但是这是如何发生的?这是否很难在框架中查找程序集引用?

1 个答案:

答案 0 :(得分:9)

ASP.NET 4引入了PreApplicationStartMethodAttribute类。此功能的主要用途是启用在Application_Start中无法完成的任务,因为它为时已晚。例如,注册构建提供程序并添加程序集引用。因此,该属性允许代码在应用程序启动时尽早在ASP.NET管道中运行,甚至在Application_Start之前。

使用此属性将是:

[assembly: PreApplicationStartMethod(typeof(SomeClassLib.Initializer), "Initialize")]

第一个参数是类型,第二个参数是方法。该方法将是没有参数的public static void方法,如下面的代码:

public static class Initializer
{
  public static void Initialize() { 
    // Whatever can we do here?
  }
}

Katana source code使用PreApplicationStartMethod挂钩到应用程序启动:

[assembly: PreApplicationStartMethod(typeof(PreApplicationStart), "Initialize")]

这有助于调用Initialize()中的PreApplicationStart方法:

public static class PreApplicationStart
{
    private const string TraceName = "Microsoft.Owin.Host.SystemWeb.PreApplicationStart";

    /// <summary>
    /// Registers the OWIN request processing module.
    /// </summary>
    public static void Initialize()
    {
        try
        {
            if (OwinBuilder.IsAutomaticAppStartupEnabled)
            {
                HttpApplication.RegisterModule(typeof(OwinHttpModule));
            }
        }
        catch (Exception exception1)
        {
            Exception exception = exception1;
            ITrace trace = TraceFactory.Create("Microsoft.Owin.Host.SystemWeb.PreApplicationStart");
            trace.WriteError(Resources.Trace_RegisterModuleException, exception);
            throw;
        }
    }
}

在第

HttpApplication.RegisterModule(typeof(OwinHttpModule));

OwinHttpModule接管并进入OwinBuilder和OwinAppContext流程,它们在程序集中查找Startup类以调用Configuration方法。