ASP.Net请求处理机制初步探索之旅 - Part 3 管道

1.先了解一下HttpModuleHttpHandlers

    http://www.cnblogs.com/tiantianle/p/5118890.html

2.

 一个十分有价值的问题就是在什么事件中我们又可以做些什么?下表就展示了这个问题的答案:

Section Event Description
HttpModule BeginRequest 此事件标志着一个新的请求,它保证在每个请求中都会被触发。
HttpModule AuthenticateRequest 此事件标志ASP.NET运行时准备验证用户。任何身份验证代码都可以在此注入。
HttpModule AuthorizeRequest 此事件标志ASP.NET运行时准备授权用户。任何授权代码都可以在此注入。
HttpModule ResolveRequest 在ASP.NET中我们通常使用OutputCache指令做缓存。在这个事件中,ASP.NET运行时确定是否能够从缓存中加载页面,而不是从头开始生成。任何缓存的具体活动可以被注入这里。
HttpModule AcquireRequestState 此事件标志着ASP.NET运行时准备获得Session会话变量。可以对Session变量做任何你想要做的处理。
HttpModule PreRequestHandlerExecute 恰好在ASP.NET 开始执行事件处理程序前发生。可以预处理你想做的事。
HttpHandler ProcessRequest HttpHandler逻辑被执行。在这个部分我们将为每个页面扩展写需要的逻辑。
Page Init 此事件发生在ASP.NET页面且可以用来: 
1、动态地创建控件,如果你一定要在运行时创建控件; 
2、任何初始化设置 
3、母版页及其设置 
在这部分中我们没有获得viewstate、postedvalues及已经初始化的控件。
Page Load 在这部分ASP.NET控件完全被加载且在这里你可以写UI操作逻辑或任何其他逻辑。NOTE:这个事件也是我们最常见且最常用的一个事件。
Page Validate 如果在页面上你有验证器,你同样想在这里做一下检查。
Page Render 是时候将输出发送到浏览器。如果你想对最终的HTML做些修改,你可以在这里输入你的HTML逻辑。
Page Unload 页面对象从内存中卸载。
HttpModule PostRequestHandlerExecute 可以注入任何你想要的逻辑,在处理程序执行之后。
HttpModule ReleaseRequestState 如果你想要保存对某些状态变量的更改,例如:Session变量的值。
HttpModule UpdateRequestCache 在结束之前,你是否想要更新你的缓存。
HttpModule EndRequest 这是将输出发送到客户端浏览器之前的最后一个阶段。

  WebForm经历的管道事件概览

  在ASP.NET WebForm应用中,其在请求处理管道中主要经历了三个重要阶段:

       ①在第八个事件中创建Page类对象并转换为IHttpHandler接口

  第八个事件是:PostMapRequestHandler如果请求的扩展名是.aspx,便会生成Page类对象,而Page类对象是实现了IHttpHandler接口的。

     ②在第九个到第十事件之间根据SessionId获取Session

ASP.Net请求处理机制初步探索之旅 - Part 3 管道_第1张图片

  第九到第十个事件是:AcquireRequestStatePostAcquireRequestState。这期间首先会接收到浏览器发过来的SessionId,然后先会将IHttpHandler接口尝试转换为IRequiresSessionState接口,如果转换成功,ASP.NET会根据这个SessionId到服务器的Session池中去查找所对应的Session对象,并将这个Session对象赋值到HttpContext对象的Session属性。如果尝试转换为IRequiresSessionState接口不成功,则不加载Session。

ASP.Net请求处理机制初步探索之旅 - Part 3 管道_第2张图片

  ③在第十一个事件与第十二个事件之间执行页面生命周期

  第十一和第十二个事件是:PreRequestHandlerExecutePostRequestHandlerExecute。在这两个事件之间,ASP.NET最终通过请求资源类型相对应的HttpHandler实现对请求的处理,其实现方式是调用在第八个事件创建的页面对象的ProcessRequest方法。

ASP.Net请求处理机制初步探索之旅 - Part 3 管道_第3张图片  

FrameworkInitialize()这个方法内部就开始打造WebForm的页面控件树,在其中调用了ProcessRequestMain方法,在这个方法里面就执行了整个ASP.NET WebFom页面生命周期。至于WebForm页面生命周期的细节,我们在本系列后续的Part 4再来细细研究。

当我们直接使用*.ashx页面的时候,它的ProcessRequest()方法就直接调用了一个FrameworkInitialize(),并最终生成响应报文,发送回客户端。

当我们在使用 *.aspx页面的时候,它继承自Page类,而Page类实现了IHttpHandler接口,然后了调用Page类的ProcessRequest()方法,其中会构建页面控件树,然后一个一个地去呈现。

 ASP.NET MVC经历的管道事件概览

   待补充。

你可能感兴趣的:(ASP.Net请求处理机制初步探索之旅 - Part 3 管道)