asp.net请求处理流程

来源:互联网 发布:下线推广 源码 编辑:程序博客网 时间:2024/05/16 23:44

1、浏览器发送请求到服务器(http://localhost)


2、服务器端处理流程

   1)服务器端分为:用户模式和内核模式
      I)内核模式:http.sys,对报文做基本的处理分析,分析端口号和 ip 地址
 II)用户模式:
    一、IIS判断一下请求资源的类型。如果是静态资源(.jpg,css,html,txt),可以直接返回给浏览器,如果是动态资源,则交给aspnet_isapi.dll
二、工作进程(w3wp.exe)
1)aspnet_isapi.dll(加载.netframework运行时) 非托管模式 (先进入ISAPIRuntime,根据传递过来的ecb句柄创建了HttpWorkerRequest,然后调用了HttpRuntime)
句柄:操作系统对所有的资源加了资源编号。操作系统根据句柄找了资源进行操作
2)HttpRuntime (调用了HttpRuntime中的ProcessRequest (HttpWorkRequest)封装了最原始的请求报文)
 
3、HttpContext:根据HttpWorkRequest创建了HttpContext,所以请求报文的数据都封装在了HttpContext中。(HttpContext已经完成了对HttpRequest和HttpResponse的初始化创建)


4、创建HttpApplication,对请求报文进行处理,所以将HttpContext传递到HttpApplication中。通过HttpApplicationFactory工厂创建出HttpApplication,在创建时,先判断HttpApplication池中是否有空闲的,如果有直接拿出来用,如果没有再去创建。使用完成后再放入池(stack)中。


5、调用HttpApplication中的ProcessRequest(HttpContext),对请求报文进行处理。


6、进入请求管道,对报文进行处理。流动的HttpContext


7、在请求管道的第8个事件,创建了页面类实例。并且是实现了IHttpHandler接口


8、在管道的第11 到第12 个事件之间,执行了,调用执行页面类中的ProcessRequest方法。如果是一般处理程序,执行程序员写的代码。如果是aspx,执行里面的Page_Load方法。
   1)如果请求的是aspx,那么在ProcessRequest方法中调用了FrameworkInitialize(),并且在该方法中又调用了this.BuildControlTree(this)
   2)创建控件树。将aspx页面中的所有控件构建成一个树,来进行组织控件的。如果aspx页面中含有html代码,那么作为普通字符来处理。封装到了LiteralControl,而该类表示:表示Html元素、文本和asp.net页中不需要在服务器上处理的任何字符串。如果是服务端控件,就要创建对应的实例。
   3)确定出IsPostBack属性
   4)完成初始化工作。PreInit,Init,InitComplete
   5)判断请求方式,如果是post,执行LoadState操作,该操作加载状态(接收从客户端提交过来的__viewstate隐藏的值,并且进行Base64编码,然后将数值赋值给相应的控件或者ViewState对象),接下来进行处理回发过来的数据(ProcessPostData)
   6)进行初始化PreLoad,Load
   7)如果是Post请求,对回发过来的数据进行二次尝试处理。对改变事件的处理(change),对回发过来的数据进行处理
   8)初始化完成(LoadComplete)
   9)准备渲染(PreRenderComplete),最后可以对控件操作
   10)SaveState(保存状态),将控件以及ViewState对象的数据,进行反Base64编码,最后赋值给__viewstate
   11)对所有的控件元素,生成对应的html代码(Render渲染过程)

0 0
原创粉丝点击