asp.net请求原理

asp.net请求原理

1、浏览器:浏览器本身是一个Socket客户端+渲染引擎。一方面,它将用户的请求封装成一个请求报文,通过Socket的方式将请求报文发送给IIS服务器。另一方面,它将IIS服务器发送来的响应报文做html解析。

 

2、IIS服务器:IIS服务器的操作系统分为内核模式和用户模式,内核模式中跑的是和系统相关的一些进程,其中有一个http.sys的模块,它主要负责监听浏览器发送过来的http请求。用户模式中跑的是一些应用程序,其中有一个IISAdmin主服务,它寄宿在Inetinfo.exe进程中,里面放的是IIS的主要配置信息(Metabase)。另外一个是w3svc管理服务,它寄宿在SvcHost.exe进程中。负责管理应用程序池和网站(网站的重启等),另外做一些初始化工作:初始化几个队列出来(根据主进程的配置信息),

 

3、当http.sys监听到一条来自客户端的请求时,把请求放到对应的工作队列里面去(工作队列有多个),再通知w3svc服务,w3svc服务看当前请求对应的网站处理程序有没有启动起来,如果已经启动起来,则直接让网站应用程序取对应的队列中取请求进行处理。如果没有启动起来,负责创建网站应用程序池。每个应用程序池中跑一个或多个网站,一个应用程序池可以启动多个进程,每个进程都称之为一个工作进程。工作进程到内核模块相应队列中取请求,处理当前请求。如果是静态页面或者js文件、CSS文件、图片直接返回。如果是非静态页面,执行C#代码,再将响应内容写到响应报文里去,响应报文通过http.sys返回给客户端。

 

4、工作进程拿到请求之后,会首先交给aspnet_isapi.dll来处理。Aspnet_isapi.dll负责启动Asp.Net运行时,再把请求分发给托管环境。请求到达托管环境之后,首先到达托管的ISAPIRuntime.PR(ecb)方法。在ISAPIRuntime内部把ecb句柄封装成了HttpWorkRequest对象。HttpWorkRequest分为两部分,请求报文和响应(当前响应为空)。

 

5、ISAPIRuntime继续把请求交给HttpRuntime来处理。由HttpRuntime.PR(wr)方法来继续处理请求。 在方法内部把workrequest封装成了HttpContext对象。

 

6、在HttpRuntime.PR()方法内部封装好了HttpContext上下文之后,再通过HttpApplication获取一个HttpApplication对象。内部:如果是第一次请求过来,那么就把global文件编译成一个类型→调用application_start()方法→通过HttpApplication池获取一个HttpApplication对象。 如果HttpApplication池没有空闲的HttpApplication对象,则通过Global文件类型反射一个实例出来。

 

7、HttpApplication实例负责管道(pipeline)的运作(根据MSDN,管道有23个步骤和19个公开的事件)。

 

8、在第六个和第七个事件之间,根据请求地址创建页面对象或者一般处理程序。在低11个和12个事件之间,执行页面对象或者一般处理程序的 PR方法,如果是页面对象,则执行页面的生命周期。页面生命周期执行完成,响应到达aspnet_isapi.dll扩展模块,扩展模块再交给内核,内核再将响应报文交给客户端。

9、页面生命周期

(1)创建页面控件树:根据页面的结构把页面中的所有的控件进行实例化,把控件关系处理好。

(2)确定IsPostback属性。

(3)初始化,包括预初始化(PreInit),初始化(Init),初始化完成(InitComplete)。

(4)加载viewstate属性,处理回发数据,从viewstate中加载了数据之后,把数据放到控件上去。把表单的数据放到控件上去。

(5)加载

(6)触发控件改变事件,触发控件的点击事件

(7)预渲染,这是最后一个改变页面状态的金辉

(8)保存页面状态

(9)渲染,把整个aspx页面生成html的过程

(10)卸载页面