asp.net - Application_Start 和 Application_OnStart 之间的区别

标签 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 能够解决这个问题。)

最佳答案

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

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

这些基本上是硬连接到经典 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;如果您注释掉该 block 中的最后一个方法,您将看到消息 C。

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

关于asp.net - Application_Start 和 Application_OnStart 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2058621/

相关文章:

c# - .NET : Changing from Windows Authentication to Forms Authentication against AD

css - 在 Razor View 中构造 CSS 链接

c# - ASP.NET MVC + Silverlight + 表单例份验证

c# - 用户登录成功后未通过身份验证

asp.net-mvc - 使用 ASP.NET MVC 时将 Global.asax 移至 iHttpModule

asp.net-mvc - 如何使用 SignalR 在 MVC 中实时通知?

javascript - 如何使用局部 View 展开/折叠 html 表格?

asp.net - 减少 ASP.NET 菜单控件大小(无需第 3 方库)

asp.net - 如何从ASP.NET页面请求中删除上载的文件并处理该请求而不损害其完整性?

c# - 返回相同对象的类中的通用方法