asp.net 应用程序启动和应用程序启动时的区别

yjghlzjz  于 2023-02-06  发布在  .NET
关注(0)|答案(3)|浏览(273)

我正在将ASP.NET MVC代码添加到预先存在的ASP.NET Webforms项目中。various tutorials建议将路由添加到从Global.asax中的Application_Start()调用的方法中。我的Global.asax已经有一个Application_OnStart(Object,EventArgs)方法,其中包含一些设置代码。
如果我尝试同时使用Start和OnStart,则不会调用OnStart(并且安装失败,导致错误)。看起来我必须选择其中一个。
我的问题是:我应该用哪一个?2它们之间有什么区别?3它们在不同的时间被调用吗?
(Note:在撰写本文时,topthreeGoogle命中是无用的和/或误导性的。我希望Stack Overflow可以解决这个问题。)

xqkwcwgp

xqkwcwgp1#

在传统的ASP中,有一些特殊的函数名,如果在全局.阿萨文件中定义了这些函数名,它们将在应用程序生命周期中的指定点运行。这些函数名定义如下:

  • 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设计/编码工具生成的签名。

iswrvxsc

iswrvxsc2#

根据Microsoft docs on the ASP.Net app life cycle,您应该在全局.asax文件中使用Application_Start方法:
Application_Start:在请求ASP.NET应用程序中的第一个资源(如页)时调用。Application_Start方法在应用程序的生命周期中只调用一次。可以使用此方法执行启动任务,如将数据加载该高速缓存中和初始化静态值。
W3 schools describes more about Application_OnStart。此方法位于阿萨中,而不是Global.asax中。
Application_OnStart:Application_OnStart事件发生在创建第一个新会话之前(第一次引用Application对象时)。此事件放置在Global.阿萨文件中。
请参阅此答案的注解,其中建议Application_OnStart用于旧版ASP,而Application_Start用于ASP.NET。

5lwkijsr

5lwkijsr3#

Application_OnStart
Application_OnStart函数在处理任何. asp文件之前调用,即在呈现任何文本或图形并将其发送到用户浏览器之前调用。在此函数中,对Active Server Pages Server对象上的CreateObject方法的以下调用将创建CDO呈现库RenderingApplication对象。如果此调用成功,objRenderApp变量将包含指向新对象的指针。
我能找到的所有参考文献都是. asp页面
Application_Start
Application_Start和Application_End方法是不表示HttpApplication事件的特殊方法。ASP.NET在应用程序域的生存期内调用它们一次,而不是为每个HttpApplication示例调用一次。
这个页面引用了. aspx页面。所以当你使用MVC并提到global. asax时,这是你应该使用的页面。

相关问题