ASP.NET页面请求过程及生命周期管道事件



Client(发送报文:请求行+请求头+空行+请求体) <------ Http 协议 ------> Server,由

Http.sys 监听 Http 请求 -> WAS+Metabase(通过URL确定WebApp工作进程) ->

W3WP.exe(一个应用程序池,加载Aspnet_IsAPI.dll) ->AppDomainFactory(构造 ApplicationManager)->ISAPIApplicationHost+ISAPIRuntime(由ApplicationManager创建)->

ISAPIWorkerRequest(根据句柄内存块封装Http请求信息,IIS版本等等)+ HttpRuntime,然后

HttpRuntime 开始接收ISAPIWorkerRequest,并如下进行处理:

创建 HttpContext(包含HttpRequest/HttpResponse等等), 和通过HttpApplicationFactory 获取或创建HttpApplication(包含HttpContext),

最后执行 HttpApplication 的 ProcessReuqest(...)。在执行过程中,所包含的管道事件,将按顺序触发。

如果某些管道事件在 HttpModule 中有被重新注册,则执行相应事件处理程序。

//context_xxxxxx 为 asp.net 管道事件,目的是逐步完善HttpContext内容

Application_Start


下面开始管道中的事件:
context_BeginRequest ////1.开始处理请求,httpModule 开始,在这之前所有实现IHttpModule的*.cs,将通过反射加载进来,并对module对象集合进行迭代,执行接口方法 Init(HttpApplication对象),这其实就是Global文件中的Application_BeginRequest,程序员可以最早介入的地方,可以在此做防盗链,屏蔽IP等等


context_AuthenticateRequest////2.授权验证请求,获取用户授权信息


context_PostAuthenticateRequest////3.获取成功


context_AuthorizeRequest////4.授权,一般来检查用户是否获取权限


context_PostAuthorizeRequest////5.获得请求


context_ResolveRequestCache////6.获取页面缓存结果


context_PostResolveRequestCache////7.已获取缓存    如果是MVC模式,则当前请求映射到MvcHandler


context_PostMapRequestHandler////8.创建页面对象:创建最终处理当前http请求的handler实例(注意,如果在此之前,使用Context.RemapHandler手动指定了映射到特定的Handler,则不会建立页面对象处理请求,而是交给指定的Handler,例如MvcHandler)


Session_Start//执行Session


context_AcquireRequestState////9.获取Session


context_PostAcquireRequestState////10.获得Session


context_PreRequestHandlerExecute////11.准备执行处理程序,在这之前所有实现IHttpHandler的*.cs,将通过反射加载进来

MyHandler//执行处理程序, 并且开始进入页面生命周期,对handler对象集合进行迭代,执行接口方法 ProcessRequest(HttpContext对象),注意是执行7 8所提到的被指定的Handler的PR函数

//其实在这之间完整的执行过程是,生成页面控件树,初始化,加载ViewState,处理回发,触发事件,渲染页面等10个事件

下面是我找到的2张图

ASP.NET页面请求过程及生命周期管道事件_第1张图片

ASP.NET页面请求过程及生命周期管道事件_第2张图片


context_PostRequestHandlerExecute ////12.已经执行了处理程序


context_ReleaseRequestState////13.释放请求的状态


context_PostReleaseRequestState////14.已经释放了请求状态


context_UpdateRequestCache////15.更新缓存


context_PostUpdateRequestCache////16.已经更新了缓存


context_LogRequest////17.请求的日志操作


context_PostLogRequest;////18.已经完成了请求的日志操作


context_EndRequest////19.本次请求处理完成,httpModule 结束,这其实就是Global文件中的Application_EndRequest


context_PreSendRequestHeaders////20.准备向客户端发送请求头数据


context_PreSendRequestContent////21.准备向客户端发送请求体数据


最后上一张整体的图吧

ASP.NET页面请求过程及生命周期管道事件_第3张图片

你可能感兴趣的:(ASP.NET页面请求过程及生命周期管道事件)