HTTPModules和Global.asax - ASP.NET页面生命周期

时间:2012-11-10 06:45:59

标签: asp.net httphandler httpmodule global-asax

我已阅读有关Asp.Net Page生命周期http://www.codeproject.com/Articles/73728/ASP-NET-Application-and-Page-Life-Cycle的精彩文章。

我的理解是请求通过MODULE(BeginRequest,authentica,author,prehandler ...)HANDLER(Proccessrequest)PAGE(Init,viewstate,load,render,......,unload)MODULE(Posthandler, postrequescache,Endreques)。

Global.asax(Application_start,Application_begin,....)究竟在上面的流程中出现了什么?澄清这将真的有帮助

Init函数是先调用还是Global.asax函数?

感谢您宝贵的时间。

3 个答案:

答案 0 :(得分:12)

IIS中的ASP.NET应用程序的结构如下图所示。我知道它可能看起来很吓人,但名字应该听起来很熟悉。希望熟悉的名字让它更容易消化。

我不打算用下面看到的结构重新说话。这张照片做得更好,然后我可以说句子。相反,我会直接了解图像对你的问题的影响。

Scary Stuff

App域
什么是App域?它是应用程序的系统内存的私有分配。域内的所有代码都使用分配的域内存。这意味着静态类型和引用在域中共享。域外的任何代码都不能访问该域的内存。

每个ASP.NET application在App Domain中为其所属的每个App Pool运行。无论应用程序池中的线程数如何,这种一对一关系都适用。

<强> Global.asax中
什么是Global.asax?最简单的是它继承自System.Web.HttpApplication的.NET类。 HttpApplication为Global.asax提供了通过请求管道引导所有HTTP请求的智能。它将触发所有请求生命周期事件,并在处理程序上调用ProcessRequest。

每个ASP.NET application将创建HttpApplication(Global.asax)的多个实例。收到请求后,它将被传递给HttpApplication个实例之一。然后,请求将在其生命周期内保留相同的HttpApplication实例。这意味着每个请求都有一个HttpApplication实例正在处理中。每个HttpApplication实例都可以并且将会在其生命周期内重复使用以处理许多请求。

应用程序事件
Application_Start等应用程序事件在哪里?这取决于,因为其中一些事件涉及App域,一些事件涉及HttpApplication。 Application_Start和Application_End指的是App Domain的开始和结束。其余的Application事件(例如Application_Begin)引用HttpApplication实例的生命周期。

更多信息
有关详细信息,我建议this MSDN文章和this非MSDN文章。

答案 1 :(得分:1)

asp.net应用程序生命周期事件注意global.asax。页面生命周期具有自己的事件。在这里阅读更多内容:

http://msdn.microsoft.com/en-us/library/ms178473.aspx

答案 2 :(得分:0)

HTTP模块与Global.asax文件

您可以在应用程序的Global.asax文件中实现模块的大部分功能,这样您就可以响应应用程序事件。但是,模块比Global.asax文件具有优势,因为它们是封装的,可以创建一次并在许多不同的应用程序中使用。通过将它们添加到全局程序集缓存(GAC)并在Machine.config文件中注册它们,您可以跨应用程序重用它们。有关更多信息,请参阅全局程序集缓存。 但是,使用Global.asax文件的优点是可以将代码放在其他已注册的模块事件中,例如Session_Start和Session_End方法。此外,Global.asax文件使您能够实例化整个应用程序中可用的全局对象。 每当需要创建依赖于应用程序事件的代码时,您应该使用模块,并且您希望在其他应用程序中重用该模块,或者您不希望在Global.asax文件中放置复杂的代码。无论何时需要创建依赖于应用程序事件的代码而不需要跨应用程序重用代码,或者需要订阅模块不可用的Session_Start等事件时,都应将代码放在Global.asax文件中。

Introduction to HTTP Modules