我正在将ASP.NETMVC代码添加到先前存在的ASP.NETWebForms项目中.various tutorials人建议将路由添加到Global.asax中名为from Application_start()的方法.我的Global.asax已经有一个带有一些设置代码的Application_OnStart(Object,EventArgs)方法.

如果我try 同时使用Start和OnStart,OnStart不会被调用(安装程序失败,导致错误).看来我得选一个.

我的问题是:我应该使用哪一种?它们之间有什么区别?他们在不同的时间打电话吗?

(注:在 compose 本文时,topthreeGoogle次点击是无用的和/或具有误导性的.我希望堆栈溢出可以解决这个问题.)

推荐答案

在传统(传统)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设计/编码工具生成的签名.

Asp.net相关问答推荐

如何在 ASP.Net Core 中验证上传的文件

我们可以在一个网页中使用多个表单吗?

强制从 /bin 而不是 GAC 加载程序集?

任何人都有解决 Internet Explorer 上剩余 n 项问题的 idea 吗?

self 跟踪实体与 POCO 实体

Window.Open 使用 PDF 流而不是 PDF 位置

如何在 ASP.NET 中使用时区?

如何缓存数据库表以防止在 Asp.net C# mvc 中出现许多数据库查询

从 RowDataBound 事件的 gridview 从单元格中获取值

我需要更改什么以允许我的 IIS7 ASP.Net 3.5 应用程序创建事件源并将事件记录到 Windows EventLog?

如何使用 javascript 调用 ASP.NET c# 方法

Devexpress 或 Telerik Controls 比较

如何在 ASP.Net Core Razor 页面上重定向

如何从后面的 ASP.NET 代码访问 HTML 表单输入

如何从url中删除returnurl?

将字典绑定到中继器

根据条件更改 GridView 行 colored颜色

如何解决我的 ASP.Net MVC 应用程序中的 iisreset 后发生的 AntiForgeryToken 异常?

ConfigurationManager.AppSettings 缓存

try 为 Medium Trust 开发是否会失败?