客户端请求发送到服务器进入管道执行页面生命周期:
客户发送请求到服务器,服务器通过扩展名扫描映射表,交给对应的扩展程序(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 完成