After receiving a new http request, IIS will eventually call asp.net _ isapi. dll ISAPI extension (especially in the IIS6.0 environment, the iis7.0 application pool defaults to the integration mode, which is relatively changed), and then passed to httpRuntime Pipe (http runtime pipeline), Asp.. Net (HttpRunTime is Asp. net), HttpRunTime automatically creates an HttpApplication instance for each asp.net application, and the instance contains the following attributes:
Note 1
Application --> equivalent to the application object in the traditional asp era, it is usually used to define a global variable of an asp.net Application.
Context --> HttpContext (Context) class instance [added by Asp. Net]
Modules --> sets of HttpModule Modules that affect the current application
Request --> similar to the Request object in asp, it is usually used to receive certain values (such as Request. Form or Request. QueryString)
Response --> similar to the Response object in asp, it is usually used to output specified content to the page (such as Resonse. Write)
Server --> similar to the Server object in asp, it can obtain some Server information (such as Server. MapPath)
Session --> similar to the Session object in asp
User --> used to obtain security information related to User authentication
From the above attributes, we can find that many of them are actually used in the asp era. Only Context, Modules, and User are newly added by Asp. Net.
In addition to the attributes of "NOTE 1", the HttpApplication class also has its own methods. Here we will mention the Init and Dispose methods, which can be reloaded.
Their call time is:
The Init method is called after Application_Start, while Dispose is called before Application_End. In addition, Application_Start is only triggered once throughout the lifecycle of the asp.net application (for example, when IIS or website is started ), similar Application_End is called only when the asp.net application is closed (for example, when IIS or website is stopped)
In addition to the Application_Start and Application_End methods, HttpApplication also provides the following events:
These events include the reloaded Init and Dispose methods mentioned above, and the Session_Start and Session_End methods corresponding to the Session can be directly stored in Global. ascx. cs is used in the form of Application_XXX (because Global. ascx. the class Global defined in cs is inherited from HttpApplication)
The Code is as follows:
Public class Global: System. Web. HttpApplication
Next, let's take a look at the three attributes of Context, Modules, and User added relative to asp.
Context:
The Context class is an instance of the HttpContext class. In the lifecycle of almost the entire aspx page, Context is always passed down along with each link.
So we can use HttpContext in almost any part of the web application. current to reference the Current Context instance. From the definition of HttpContext, you can also find that the attributes of Context can also get Application, ApplicationInstance, Profile, Response. request... and so on.
Recall:
he Code is as follows:
Public class Handler1: IHttpHandler
{
Public void ProcessRequest (HttpContext context)
{
Context. Response. ContentType = "text/plain ";
Context. Response. Write ("Hello World ");
}
Public bool IsReusable
{
Get
{
Return false;
}
}
}
When we use an ashx file, the ProcessRequest method is to pass in the current context, and then get the reference of the Response object through context, and finally output any desired content to the page.
Modules:
Every class that implements the IHttpModule interface can be considered as an Http module component. It can be understood as an http request interceptor. After an http request is intercepted, it can modify the Context being processed, after the completion, return the control to the pipeline. If there are other Modules, continue to process them until the HttpModule in all the Modules sets is "refreshed". (Note: the poor http request is sent to the httpModule round X)
Asp. net2.0 has many built-in httpmodules by default. The following default built-in modules can be found in the Machine. Config file:
Note 2
AnonymouseIdentification-assigns a temporary identity to anonymous users
FileAuthorization -- verify if the user has a Windows NT license for the requested file
FormsAuthentication-form Authentication Module (if this module is not available, asp.net will not be able to authenticate using the user name/password [FOrms] mode)
OutputCache-output cache Module
PassportAuthentication-PassPort verification module
Profile-user configuration module (if it is not available, Profile cannot be used in asp.net)
RoleManager-role management
SessionSate -- session Status Module
UrlAuthorization-URL-based authentication module
WindowsAuthentication-Authentication Module for Windows and IIS
User:
If you have used asp. net2.0's built-in Membership/Role mechanism for access authentication, you will be familiar with User objects, such:
The Code is as follows:
If (HttpContext. Current. User. Identity. IsAuthenticated)
{
// The user has logged on...
}
It is often used to determine the logon status of the current browser User. For more details about the User class, see the MSDN
Lifecycle:
Finally, let's review the lifecycle of the Page in Asp. Net. The Page defines several events:
In general, when An ASPX Page is requested, the final lifecycle is the above events defined in the Page (there are some reload-able callback methods) as well as the previously mentioned events defined in the HttpApplication class (with the corresponding callback method) jointly triggered or called, and finally formed a series of processing processes.
If you do not consider the event processing method in HttpApplication (that is, we do not consider the event processing method in Global. ascx. the Application_XXX processing method defined in cs). The general trigger (CALL) sequence of events (methods) in Page is as follows:
01. Page_PreInit
02. Page_Init
03. Page_InitComplete
04. Page_PreLoad
05. Page_Load
06. Page_LoadComplete
07. Page_PreRender
08. Page_SaveStateComplete
09. Page_Unload
This is the normal order of the Page subcontrol without sending back the Page. If you add the Page sending back (for example, put an asp: Button in the Page, then add the processing function to the Button's Click sending back event), the order changes slightly:
01. Page_PreInit
02. Page_Init
03. Page_InitComplete
04. Page_PreLoad
05. Page_Load
06. button#click
07. Page_LoadComplete
08. Page_PreRender
09. Page_SaveStateComplete
10. Page_Unload
The difference is that the callback event Button1_Click is triggered after Page_Load.
Finally, let's take the HttpApplication event into consideration and look at the overlapping order. But let's take a look at a special situation first. If the ghost page is not set in the root directory of an asp.net application, then, you can directly browse the root directory, for example, when http: // localhost: 2345/, Globl. ascx. the call sequence of the Application_XXX method defined in cs is as follows:
15:01:39 413 Application_Start
15:01:39 491 Init
15:01:39 491 Application_BeginRequest
2010-03-28 15:01:39 506 Application_AuthenticateRequest
15:01:39 506 Application_PostAuthenticateRequest
15:01:39 506 Application_AuthorizeRequest
15:01:39 522 Application_PostAuthorizeRequest
2010-03-28 15:01:39 522 Application_ResolveRequestCache
2010-03-28 15:01:39 522 Application_PostResolveRequestCache
15:01:39 522 Application_PostMapRequestHandler
2010-03-28 15:01:39 522 Application_AcquireRequestState
15:01:39 537 Application_PostAcquireRequestState
2010-03-28 15:01:39 537 Application_PreRequestHandlerExecute
15:01:39 553 Application_Error
15:01:39 553 Application_EndRequest
15:01:39 569 Application_PreSendRequestHeaders
15:01:39 569 Application_PreSendRequestContent
We can see that the Application_Error event is triggered, that is, HttpRuntime considers this as an error.
Then, you can browse an existing page. If the Application is shut down due to a serious error (such as a web. config configuration error), The Calling sequence is as follows:
15:03:47 704 Application_BeginRequest
2010-03-28 15:03:47 704 Application_AuthenticateRequest
15:03:47 766 Application_PostAuthenticateRequest
15:03:47 766 Application_AuthorizeRequest
15:03:47 766 Application_PostAuthorizeRequest
2010-03-28 15:03:47 766 Application_ResolveRequestCache
2010-03-28 15:03:47 783 Application_PostResolveRequestCache
15:03:48 667 Application_PostMapRequestHandler
2010-03-28 15:03:48 667 Application_AcquireRequestState
15:03:48 683 Application_PostAcquireRequestState
2010-03-28 15:03:48 698 Application_PreRequestHandlerExecute
15:03:48 745 Page_PreInit
15:04:02 903 Page_Unload
15:04:02 903 Application_Error
15:04:02 918 Application_EndRequest
15:04:02 996 Application_PreSendRequestHeaders
15:04:02 996 Application_PreSendRequestContent
15:04:03 371 Application_Disposed
15:04:03 371 Dispose
15:04:03 386 Application_End
By comparing the previous steps, we will find that Application_Start and Init are not called again, and also confirm some of the conclusions mentioned above (Application_Start is triggered only once throughout the asp.net application lifecycle ), the last three outputs show that Application_Disposed, Dispose, and Application_End are called sequentially when the application is closed.
Then, "Review" (The web Server restarts) the normally accessed page. The order is as follows:
15:08:11 513 Application_Start
15:08:11 591 Init
15:08:11 591 Application_BeginRequest
2010-03-28 15:08:11 591 Application_AuthenticateRequest
15:08:11 591 Application_PostAuthenticateRequest
15:08:11 606 Application_AuthorizeRequest
15:08:11 606 Application_PostAuthorizeRequest
2010-03-28 15:08:11 606 Application_ResolveRequestCache
2010-03-28 15:08:11 606 Application_PostResolveRequestCache
15:08:11 622 Application_PostMapRequestHandler
15:08:11 637 Application_EndRequest
15:08:11 637 Application_PreSendRequestHeaders
15:08:11 637 Application_PreSendRequestContent
15:08:11 637 Application_BeginRequest
2010-03-28 15:08:11 637 Application_AuthenticateRequest
15:08:11 653 Application_PostAuthenticateRequest
15:08:11 653 Application_AuthorizeRequest
15:08:11 653 Application_PostAuthorizeRequest
2010-03-28 15:08:11 653 Application_ResolveRequestCache
2010-03-28 15:08:11 653 Application_PostResolveRequestCache
15:08:11 653 Application_PostMapRequestHandler
15:08:11 653 Session_Start
2010-03-28 15:08:11 653 Application_AcquireRequestState
15:08:11 653 Application_PostAcquireRequestState
2010-03-28 15:08:11 653 Application_PreRequestHandlerExecute
15:08:11 669 Page_PreInit
15:08:11 684 Page_Init
15:08:11 684 Page_InitComplete
15:08:11 684 Page_PreLoad
15:08:11 684 Page_Load
15:08:11 684 Page_LoadComplete
15:08:11 684 Page_PreRender
15:08:11 684 Page_SaveStateComplete
15:08:11 700 Page_Unload
2010-03-28 15:08:11 700 Application_PostRequestHandlerExecute
15:08:11 700 Application_ReleaseRequestState
2010-03-28 15:08:11 700 Application_PostReleaseRequestState
15:08:11 700 Application_UpdateRequestCache
2010-03-28 15:08:11 700 Application_PostUpdateRequestCache
15:08:11 700 Application_EndRequest
15:08:11 700 Application_PreSendRequestHeaders
15:08:11 700 Application_PreSendRequestContent
15:08:11 793 Application_BeginRequest
2010-03-28 15:08:11 793 Application_AuthenticateRequest
15:08:11 793 Application_PostAuthenticateRequest
15:08:11 793 Application_AuthorizeRequest
15:08:11 793 Application_PostAuthorizeRequest
2010-03-28 15:08:11 793 Application_ResolveRequestCache
2010-03-28 15:08:11 793 Application_PostResolveRequestCache
15:08:11 809 Application_PostMapRequestHandler
2010-03-28 15:08:11 809 Application_AcquireRequestState
15:08:11 809 Application_PostAcquireRequestState
2010-03-28 15:08:11 809 Application_PreRequestHandlerExecute
2010-03-28 15:08:11 825 Application_PostRequestHandlerExecute
15:08:11 825 Application_ReleaseRequestState
2010-03-28 15:08:11 840 Application_PostReleaseRequestState
15:08:11 949 Application_UpdateRequestCache
2010-03-28 15:08:11 949 Application_PostUpdateRequestCache
15:08:11 965 Application_EndRequest
15:08:11 981 Application_PreSendRequestHeaders
15:08:11 981 Application_PreSendRequestContent
Wow! When a Page is accessed, so many methods are called. No wonder many large websites with high concurrency usually have to write a reduced HttpHandler to replace the Page as the base class, to achieve better performance
Finally, when developing a website, we cannot only use the Page. In many cases, we also use UserControl (custom control). Let's take a look at its inheritance relationship, for example, we have created a user control named TestUserControl.
TestUserControl --> UserControl ---> TemplateControl --> Control
In the definition of the Control class, we can see that
This seems to indicate that the user control should contain Page_Init, Page_Load, Page_Unload... usually we only use Init and Load events. If a user control is added, the entire lifecycle will be more complex:
2010-06-12 15:35:28 042 Application_Start
2010-06-12 15:35:28 072 Init
2010-06-12 15:35:28 072 Application_BeginRequest
2010-06-12 15:35:28 082 Application_AuthenticateRequest
2010-06-12 15:35:28 082 Application_PostAuthenticateRequest
2010-06-12 15:35:28 092 Application_AuthorizeRequest
15:35:28 102 Application_PostAuthorizeRequest
2010-06-12 15:35:28 102 Application_ResolveRequestCache
2010-06-12 15:35:28 112 Application_PostResolveRequestCache
15:35:28 122 Application_PostMapRequestHandler
15:35:28 142 Application_EndRequest
15:35:28 142 Application_PreSendRequestHeaders
15:35:28 142 Application_PreSendRequestContent
15:35:28 152 Application_BeginRequest
2010-06-12 15:35:28 152 Application_AuthenticateRequest
15:35:28 162 Application_PostAuthenticateRequest
15:35:28 162 Application_AuthorizeRequest
15:35:28 162 Application_PostAuthorizeRequest
2010-06-12 15:35:28 172 Application_ResolveRequestCache
2010-06-12 15:35:28 172 Application_PostResolveRequestCache
15:35:28 172 Application_PostMapRequestHandler
15:35:28 172 Session_Start
2010-06-12 15:35:28 172 Application_AcquireRequestState
15:35:28 182 Application_PostAcquireRequestState
2010-06-12 15:35:28 182 Application_PreRequestHandlerExecute
15:35:28 192 Page_PreInit
15:35:28 192 TestUserControl. Page_Init
15:35:28 202 Page_Init
15:35:28 202 TestUserControl. TestProperty. Set
15:35:28 202 Page_InitComplete
15:35:28 202 Page_PreLoad
15:35:28 202 Page_Load
15:35:28 202 TestUserControl. Page_Load
15:35:28 202 TestUserControl. ShowData ()
15:35:28 212 TestUserControl. Repeater1.ItemDataBound ()
15:35:28 212 TestUserControl. Repeater1.ItemDataBound ()
15:35:28 212 TestUserControl. Repeater1.ItemDataBound ()
15:35:28 212 TestUserControl. Repeater1.ItemDataBound ()
15:35:28 212 TestUserControl. Repeater1.ItemDataBound ()
15:35:28 222 TestUserControl. Repeater1.ItemDataBound ()
15:35:28 222 TestUserControl. Repeater1.ItemDataBound ()
15:35:28 222 TestUserControl. Repeater1.ItemDataBound ()
15:35:28 222 TestUserControl. Repeater1.ItemDataBound ()
15:35:28 222 TestUserControl. Repeater1.ItemDataBound ()
15:35:28 232 TestUserControl. Repeater1.ItemDataBound ()
15:35:28 232 Page_LoadComplete
15:35:28 232 Page_PreRender
15:35:28 232 TestUserControl. Page_PreRender
15:35:28 242 Page_SaveStateComplete
15:35:28 242 TestUserControl. Page_Unload
15:35:28 252 Page_Unload
2010-06-12 15:35:28 252 Application_PostRequestHandlerExecute
15:35:28 252 Application_ReleaseRequestState
2010-06-12 15:35:28 252 Application_PostReleaseRequestState
15:35:28 262 Application_UpdateRequestCache
2010-06-12 15:35:28 262 Application_PostUpdateRequestCache
15:35:28 262 Application_EndRequest
15:35:28 272 Application_PreSendRequestHeaders
15:35:28 272 Application_PreSendRequestContent
15:35:28 282 Application_BeginRequest
2010-06-12 15:35:28 292 Application_AuthenticateRequest
15:35:28 292 Application_PostAuthenticateRequest
15:35:28 302 Application_AuthorizeRequest
15:35:28 302 Application_PostAuthorizeRequest
2010-06-12 15:35:28 302 Application_ResolveRequestCache
2010-06-12 15:35:28 312 Application_PostResolveRequestCache
15:35:28 312 Application_PostMapRequestHandler
2010-06-12 15:35:28 322 Application_AcquireRequestState
15:35:28 322 Application_PostAcquireRequestState
2010-06-12 15:35:28 322 Application_PreRequestHandlerExecute
2010-06-12 15:35:28 332 Application_PostRequestHandlerExecute
15:35:28 332 Application_ReleaseRequestState
2010-06-12 15:35:28 332 Application_PostReleaseRequestState
15:35:28 342 Application_UpdateRequestCache
2010-06-12 15:35:28 342 Application_PostUpdateRequestCache
15:35:28 342 Application_EndRequest
15:35:28 342 Application_PreSendRequestHeaders
15:35:28 342 Application_PreSendRequestContent
2010-06-12 15:36:40 034 Session_End