Application_Start和Application_OnStart之间的区别

时间:2010-01-13 17:01:00

标签: asp.net asp.net-mvc global-asax

我正在将ASP.NET MVC代码添加到预先存在的ASP.NET Webforms项目中。 various tutorials建议将路由添加到Global.asax中从Application_Start()调用的方法。我的Global.asax已经有一个带有一些设置代码的Application_OnStart(Object,EventArgs)方法。

如果我尝试同时使用Start和OnStart,则不会调用OnStart(并且安装失败,导致错误)。看起来我必须选择其中一个。

我的问题是:我应该使用哪一个?他们之间有什么区别?他们是在不同的时间被召唤的吗?

(注意:在撰写本文时,top three Google次点击是无用的和/或误导性的。我希望Stack Overflow可以解决这个问题。)

3 个答案:

答案 0 :(得分:73)

在经典(传统)ASP中,有一些特殊的函数名称,如果在global.asa文件中定义,将在应用程序生命周期中的指定点运行。这些定义为:

  • Application_OnStart - 当您的应用程序收到第一个HTTP请求时,并且在处理任何.ASP文件之前立即运行一次。
  • Application_OnEnd - 在应用程序关闭期间,在处理完所有请求后运行一次。
  • Session_OnStart - 在每个唯一用户会话的开头运行。如果用户/客户端禁用了cookie,则会针对每个请求运行,因为ASP从未检测到标识现有会话的会话cookie。
  • Session_OnEnd - (理论上!)每次用户会话到期时运行。祝你好运。

这些基本上是硬连接到经典的ASP运行时 - 你无法更改它们,也不能将任何其他方法附加到这些事件。

在ASP.NET中,有一个名为AutoEventWireup的东西,它使用反射来查找符合特定命名约定的方法,并运行这些方法以响应ASP.NET运行时引发的匹配事件。最常见的示例是Page_Load方法,该方法会自动调用以响应Page类在页面生命周期中触发Load事件。

使用相同的技术将处理程序附加到应用程序级生命周期事件。它将查找名为ModuleName_EventName或ModuleName_OnEventName的方法,不带参数()(object sender, EventArgs e)

这是有趣的部分 - 如果您定义了多个匹配方法,则只会执行文件中最新的那个。 (最后一种方法基本胜出)

所以如果你的global.asax.cs看起来像这样:

public class Global : System.Web.HttpApplication {
    protected void Application_Start() {
        Debug.WriteLine("A: Application_Start()");
    }

    protected void Application_Start(object sender, EventArgs e) {
        Debug.WriteLine("B: Application_Start(object sender, EventArgs e)");
    }

    protected void Application_OnStart() {
        Debug.WriteLine("C: Application_OnStart()");

    }
    protected void Application_OnStart(object sender, EventArgs e) {
        Debug.WriteLine("D: Application_OnStart(object sender, EventArgs e)");
    }
}

你会在调试输出中看到消息D;如果你注释掉该块中的最后一个方法,你会看到消息C代替。

所以 - 使用您喜欢的任何命名约定,但如果您定义多个命名约定,则只会执行源文件中最后出现的那个。我个人坚持使用Application_Start(object sender, EventArgs e),因为这是Visual Studio项目模板和大多数.NET设计/编码工具生成的签名。

答案 1 :(得分:10)

根据Microsoft docs on the ASP.Net app life cycle,您应该在global.asax文件中使用Application_start方法:

Application_Start:在请求ASP.NET应用程序中的第一个资源(例如页面)时调用。在应用程序的生命周期中,Application_Start方法仅被调用一次。您可以使用此方法执行启动任务,例如将数据加载到缓存中以及初始化静态值。

Application_OnStart:Application_OnStart事件发生在创建第一个新会话之前(首次引用Application对象时)。 This goes in Global.asa,而不是global.asax。

答案 2 :(得分:5)

Application_OnStart

  

在处理任何.asp文件之前调用Application_OnStart函数 - 在呈现任何文本或图形并将其发送到用户的浏览器之前。在此函数中,以下对Active Server Pages Server对象上的CreateObject方法的调用将创建CDO Rendering Library RenderingApplication对象。如果此调用成功,则objRenderApp变量包含指向新对象的指针。

我能找到的所有参考文献都参考.asp页面

Application_Start

  

Application_Start和Application_End方法是不代表HttpApplication事件的特殊方法。 ASP.NET在应用程序域的生命周期内调用它们一次,而不是为每个HttpApplication实例调用它们。

此页面指的是.aspx页面。因此,当您使用MVC并提及global.asax时,这是您应该使用的那个。