有许多地方可以在ASP.NET中执行初始化代码:
PreApplicationStartMethod
PostApplicationStartMethod
Application_Start
这些事件的排序是什么?此列表中是否还有其他附加项目?
编辑:由于提到静态与第一个调用位置相关,我将为他们打破这个
WebActivator PreApplicationStartMethod
WebActivator PostApplicationStartMethod
Global.asax Application_Start
为了清楚起见,假设在上面的例子中,每个都依赖于在该位置使用的Foo / Bar / Baz类,并且该类包含静态构造函数和静态只读字段。
答案 0 :(得分:11)
静态构造函数和静态字段初始化由运行时决定,而不是ASP.NET。 Eric Lippert最近发布了一篇很棒的four - part blog series详细介绍了它们的工作原理。
对于您提到的其他项目,首先执行标有System.Web.PreApplicationStartMethodAttribute
的方法。根据此属性的MSDN文档,无法保证调用这些方法的顺序。
根据Phil Haack的a blog post,该属性使开发人员有机会在应用程序启动期间调用另外两种方法:BuildProvider.RegisterBuildProvider
和BuildManager.AddReferencedAssembly
。 BuildManager.AddReferenceAssembly
的MSDN文档指出此方法只能在应用程序的Application_PreStartInit阶段执行,这表明当System.Web.PreApplicationStartMethodAttribute
标记的所有方法都被执行时。
WebActivator使用框架的PreApplicationStartMethodAttribute
来挂钩应用程序的启动。一旦被调用,它将搜索并执行WebActivator.PreApplicationStartMethodAttribute
标记的所有方法,然后动态注册an HttpModule,稍后将调用PostApplicationStartMethodAttribute
标记的所有方法 - 在调用Application_Start之后HttpApplication类。
总而言之,订单是:
PreApplicationStartMethodAttribute
WebActivator.PostApplicationStartMethodAttribute
答案 1 :(得分:2)
应用程序生命周期如下所示:
此外,以下是请求管道中发生的事件:
请参阅ASP.NET Application Life Cycle Overview
静态构造函数和静态只读字段(实例化内联)在代码第一次使用该类型时进行初始化。这可能发生在应用程序生命周期的任何一点。
专门回答您的问题
根据WebActivator project page,这是事件的顺序:
就静态初始化而言,请参阅贾斯汀在答案中链接的Eric Lipperts posts。
答案 2 :(得分:0)
您当前的列表中有一些不一定与ASP.NET相关的内容(静态只读字段等),但this link描述了ASP.NET生命周期。有很多事情发生,其中许多都允许自定义,如果你有充分的理由,你可以注入一些自己的代码。
你的问题非常广泛。你有什么想在这里完成的事情,希望磨练这个过程的哪个部分对你想做的事情是理想的?