在传统(传统)ASP中,如果在global.asa文件中定义了一些特殊函数名,它们将在应用程序生命周期中的指定点运行.这些定义如下:
- APPLICATION_OnStart-当您的应用程序收到第一个HTTP请求时,紧接着处理任何.ASP文件之前,运行一次.
- APPLICATION_OnEnd-在处理完所有请求后,在应用程序关闭期间运行一次.
- Session_OnStart-在每个唯一用户会话开始时运行.如果用户/客户端禁用了cookie,则会针对每个请求运行此操作,因为ASP从未检测到标识现有会话的会话cookie.
- 会议结束-(理论上!)每次用户会话过期时运行.祝你好运.
这些基本上是硬连接到classic ASP运行时中的-您不能更改它们,也不能将任何其他方法附加到这些事件.
在ASP.NET中,有一个名为AutoEventWireup
的东西,它使用反射来查找符合特定命名约定的方法,并运行这些方法以响应ASP.NET运行时.最常见的例子是Page_Load
方法,该方法在页面生命周期中自动调用,以响应页面类触发加载事件.
同样的技术也用于将处理程序附加到应用程序级生命周期事件.它将查找名为ModuleName_EventName或ModuleName_OnEventName的方法,不带参数()
或(object sender, EventArgs e)
这里是有趣的部分-if you define more than one matching method, only the one that appears latest in the file will execute.(基本上,最后一种方法获胜)
因此,如果您的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设计/编码工具生成的签名.