管道及页面生命周期

 

客户端请求发送到服务器进入管道执行页面生命周期:

  客户发送请求到服务器,服务器通过扩展名扫描映射表,交给对应的扩展程序(aspnet_isapi.dll),扩展程序把请求传入framwork,即调用ISAPIRuntime pr方法,调用HttpRuntime pr方法,会创建HttpWorkerRequest,将请求封装到HttpContext,通过HttpApplicationFactory创建HttpApplication负责处理整个请求--调用pr方法,将HttpContext传入application,进去请求管道。在第8到9个事件间根据HttpContext里的HttpRequest找到被请求报文里的页面路径,根据反射创建页面对象,转成IHttpHandler接口对象。执行11,12事件之间调用前面创建页面的pr方法,同时将上下文传入。执行完后调用FinishRequest方法,生成响应报文,通过HttpWorkerRequest将响应报文发回给扩展程序,交给iis,iis通过套接字将响应报文发给浏览器。

第8个事件:--PostMapRequestHandler反射创建页面对象,并转成IHttpHandler接口对象。

第9-11个事件:有一个事件会先尝试将页面类对象转成IRequiresSessionState接口对象,如果转换不成功则不加载session对象,转换成功则从请求报文头中获得Cookie里的sessionid,然后到服务器的session池中找到对应的session对象赋给上下文中的session对象。

第11-12个事件:执行页面对象pr方法,调用页面FrameWorkInitialize() 调用_buildControlTree()方法打造控件树,执行页面生命周期。将上下文中session对象赋给page对象的session属性。

 

_buildControlTree()方法构造控件树

每个控件都有Controls属性来保存它的子节点

LoadState:分析请求报文里名为_VIEWSTATE的隐藏域,将里面的字符串反base64编码,然后反序列化还原成集合对象;将其中用户添加的属性存入页面对象的ViewState属性中。同时将服务器端控件的属性值从隐藏域中还原。

PageLoad

SaveState:将所有服务器端控件的属性及值保存到ViewState属性中,最后在页面生成html代码的时候,遍历ViewState中的键值集合,然后将里面的序列化,将序列化后的字符串Base64编码生成名为_VIEWSTATE的隐藏域。

存入response

遍历控件树,调用每个控件的render方法(传入一个TextWrite对象)从而生成整个页面的html代码,每个控件生成的html代码都按照次序存在了同一个TextWrite中。当执行到HtmlForm表单控件时,此控件的Render方法里会去读取ViewState里的每个键值对,并将他们序列化成字符串,然后进行base64编码得到一个新的字符串,最终生成一个隐藏域存放字符串。

 

 

过滤器

IHttpModule

自定义管道

namespace MyModule

{

public class MyTestModule:IHttpModule

{

public void Init(HttpApplication context)

{

context.BeginRequest+=MyBeginRequest;

}

public void MyBeginRequest(object sender,EventArgs e)

{

HttpApplication application=sender as HttpApplication;

application.Context.Response.Write("我是在MyModule里注册到BeginRequest事件上的方法!");

}

}

}

 

配置网站web.config节点

<system.webServer>

<modules>

<add name="myModule" type="MyModule.MyTestModule"></add>

</modules>

</system.webServer>

 

 

请求管道中的19个事件.

(1)BeginRequest: 开始处理请求

(2)AuthenticateRequest授权验证请求,获取用户授权信息

(3):PostAuthenticateRequest获取成功

(4): AunthorizeRequest 授权,一般来检查用户是否获得权限

(5):PostAuthorizeRequest:获得授权

(6):ResolveRequestCache:获取页面缓存结果

(7):PostResolveRequestCache 已获取缓存 

(8):PostMapRequestHandler 创建页面对象

(9):PostAcquireRequestState 获取Session

(10)PostAcquireRequestState 获得Session

(11)PreRequestHandlerExecute:准备执行页面对象

(12)PostRequestHandlerExecute 执行完页面对象了

(13)ReleaseRequestState 释放请求状态

(14)PostReleaseRequestState 已释放请求状态

(15)UpdateRequestCache 更新缓存

(16)PostUpdateRequestCache 已更新缓存

(17)LogRequest 日志记录

(18)PostLogRequest 已完成日志

(19)EndRequest 完成

 

posted @ 2017-05-09 16:03  jechsky  阅读(259)  评论(0编辑  收藏  举报