在经典(旧版)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 设计/编码工具生成的签名。