我们都知道浏览器的作用就是将用户请求的内容封装成HTTP报文的形式然后通过Socekt套接字和域名解析服务器(DNS)将域名转成ip地址发送到服务器
服务器端的Windows操作系统分为两个部分IIS运行在用户模式下而监听端口的那部分是运行在内核模式HTTPSYS(内核模块也是一个插件机制socket通信机制在内核模块中内核模块也是一种通信机制)下的属于HTTP处理的内核模块内核模式可以监听当前机器所有的Http请求并将当前请求进行简单解析确定协议的类型请求的端口访问注册表确定当前的请求需要交给IIS进行处理
IIS接收到请求之后访问INetInfoexe(IIS主进程中的元数据信息)判断文件的类型并查询当前的请求需要经过那个扩展程序处理如果是静态文件(htmljsjpeggit)直接将文件从服务器读取出来按照原路返回如果是动态文件(ashxaspx)则交给扩展程序aspnet_isapidll文件执行aspnet_isapidll是一个扩展程序实现了IIS内部的一些API也是一种请求过滤的插件它的作用是负责启动托管环境初始化托管环境将请求分发给托管环境也就是说它负责启动aspnet Runtime创建aspnet运行环境将请求交给ISAPIRuntime的PR方法
ISAPIRuntime是进入NET托管环境的入口它在方法中通过一个ecb句柄指向了当前请求报文体的内存地址将HTTP请求报文简单封装为一个HttpWorkRequest对象
调用HttpRuntimePR(wr:(HttpWorkRequest对象))根据 HttpWorkRequest对象封装成一个HttpContext上下文对象它包含了所有的请求信息然后交给HttpApplicationFactory进行处理
根据HttpApplication获得一个HttpApplication对象的实例获取实例的时候先去Application池中去找是否有空闲的HttpApplication对象如果有则直接返回一个对象不存在的话就就先编译globle文件生成一个HttpApplication的派生类通过反射创建一个HttpApplication实例并返回并开始处理用户的请求
用户的请求是通过触发HttpApplication的个事件个步骤进行处理的如果是一般处理程序(ashx)那么执行完管道中的事件后按照原路进行返回如果是aspx页面那么就开始走页面的生命周期了
页面生命周期的主要步骤如下
创建页面控制树那么如何创建页面树的结构呢?把它封装成了一个方法这个方法的名字就叫做FrameworkInitliaze() 在方法内部给aspx上所有的控件都New一个实例然后构造一个树的结构即是有一个树的结构只有执行创建页面之后页面上才会有控件
判断IspostBack确定是否回发
初始化
初始化包括三个阶段
)PreInint()预初始化
A调用OnPreinit方法引发PreInit事件
B利用App_Themes目录中的内容进行初始化主题以动态实现一个PageThem
属性值并创建一个编译类的实例
C应用模板页
)开始初始化将所创建的控件树上的控件都new一个实例并赋默认值
A递归初始化Controls集合中的控件初始化包括设置这些控件的属性
B递归应用控件皮肤
C调用OnInit方法以引发自身的Init事件接着递归调用子控件的OnInit方法来
引发他们的Init事件
D调用自身的TrackViewState方法重启自身的视图状态跟蹤接着递归调用子控
件的TrackViewState方法重启自身的视图状态跟蹤
)InitComplete()初始化完成
加载ViewState处理回发数据
加载页面状态解析隐藏域中的ViewStateViewState保持的值赋值到对应
控件中把需要触发事件的控件放到一个集合当中去
预加载(PreLoad)
页面调用OnPreLoad方法以引发PreLoad事件该事件表示页面生命周期进
入加载阶段对应sapxcs中的Page_Load事件
加载(Load)
页面首先调用自身的OnLoad方法以引发自身的Load事件接着递归调用
Contorls集合中控件的OnLoad方法以引发它们的Load事件
ProcessPostData第二次处理回发数据
触发改变的事件和点击事件
页面加载完成
预渲染对空间树进行最后一次处理
保存当前页面的状态
页面渲染
页面生命周期结束后形成了页面继续执行管道之后的事件执行完毕后按照原路返回到客户端