我正在将ASP.NET MVC代码添加到预先存在的ASP.NET Webforms项目中。various tutorials建议将路由添加到从Global.asax中的Application_Start()调用的方法中。我的Global.asax已经有一个Application_OnStart(Object,EventArgs)方法,其中包含一些设置代码。
如果我尝试同时使用Start和OnStart,则不会调用OnStart(并且安装失败,导致错误)。看起来我必须选择其中一个。
我的问题是:我应该用哪一个?2它们之间有什么区别?3它们在不同的时间被调用吗?
(Note:在撰写本文时,topthreeGoogle命中是无用的和/或误导性的。我希望Stack Overflow可以解决这个问题。)
3条答案
按热度按时间xqkwcwgp1#
在传统的ASP中,有一些特殊的函数名,如果在全局.阿萨文件中定义了这些函数名,它们将在应用程序生命周期中的指定点运行。这些函数名定义如下:
这些基本上是硬连接到经典ASP运行时中的-您不能更改它们,也不能将任何其他方法附加到这些事件。
在ASP.NET中,有一个叫做
AutoEventWireup
的东西,它使用反射来查找符合特定命名约定的方法,并运行这些方法来响应ASP.NET运行时引发的匹配事件。最常见的例子是Page_Load
方法,它在页面生命周期中响应Page类触发Load事件而自动调用。相同的技术也用于将处理程序附加到应用程序级生命周期事件。它将查找名为ModuleName_EventName或ModuleName_OnEventName的方法,这些方法不带参数
()
或(object sender, EventArgs e)
有趣的是-如果您定义了多个匹配方法,那么只有文件中最新出现的方法才会执行(基本上,最后一个方法胜出)。
因此,如果您的global.asax.cs看起来像这样:
您将在调试输出中看到消息D;如果注解掉代码块中的最后一个方法,您将看到消息C。
所以--使用你喜欢的命名约定,但是如果你定义了多个,那么只有出现在源文件最后的那个会被执行。我个人坚持使用
Application_Start(object sender, EventArgs e)
,因为它是由Visual Studio项目模板和大多数.NET设计/编码工具生成的签名。iswrvxsc2#
根据Microsoft docs on the ASP.Net app life cycle,您应该在全局.asax文件中使用
Application_Start
方法:Application_Start
:在请求ASP.NET应用程序中的第一个资源(如页)时调用。Application_Start方法在应用程序的生命周期中只调用一次。可以使用此方法执行启动任务,如将数据加载该高速缓存中和初始化静态值。W3 schools describes more about
Application_OnStart
。此方法位于阿萨中,而不是Global.asax中。Application_OnStart
:Application_OnStart事件发生在创建第一个新会话之前(第一次引用Application对象时)。此事件放置在Global.阿萨文件中。请参阅此答案的注解,其中建议
Application_OnStart
用于旧版ASP,而Application_Start
用于ASP.NET。5lwkijsr3#
Application_OnStart
:Application_OnStart函数在处理任何. asp文件之前调用,即在呈现任何文本或图形并将其发送到用户浏览器之前调用。在此函数中,对Active Server Pages Server对象上的CreateObject方法的以下调用将创建CDO呈现库RenderingApplication对象。如果此调用成功,objRenderApp变量将包含指向新对象的指针。
我能找到的所有参考文献都是. asp页面
Application_Start
Application_Start和Application_End方法是不表示HttpApplication事件的特殊方法。ASP.NET在应用程序域的生存期内调用它们一次,而不是为每个HttpApplication示例调用一次。
这个页面引用了. aspx页面。所以当你使用MVC并提到global. asax时,这是你应该使用的页面。