Asp.Net生命周期系列一

28次阅读

Asp.Net 生命周期对于初级甚至中级程序员来说,一直都是一个难题,很多程序员不了解生命周期,导致使用 Asp.Net 做开发感觉很不灵活,感觉太多东西被微软封装好了,我们不能改变,其实只要你稍微了解一下就知道,原来不是这样的! 我写这一系列文章是采用总分的方式,先让大家整体了解,然后再逐一突破。先将一个故事,也是园子里看到的 我认为这个写的有些细节上的错误,稍稍添加些自己的想法和理解,如有错误,还请留言!
当你访问博客园想看我的这篇文章的时候,这个请求就被博客园的 WEB SERVER(IIS)接收到了【其实是被 IIS 中的一个叫做 inetinfo.exe 的进程截获了】。博客园 IIS 看了一眼你的请求,“ 噢,是.aspx 啊,给 aspnet_isapi.dll 去处理吧,就把我这个请求给了 aspnet_isapi.dll,并且说:“ 这个你来处理,你处理完了之后把 HTML 给我,我好给请求者一个回复 ”。
aspnet_isapi.dll 收到 IIS 传递过来的请求后也没时间抱怨啊 就开始干活儿了。怎么干的呢? 其实啊很简单,就是通过一个 http pipeline 管道转交给了 aspnet_wp.exe 进程,接下来就到了.netFramework 的 HttpRunTime 处理中 心,HttpRunTime 它其实就是做了几件事情。
第一,它先创建了一个 Context 对象,它就像个箱子,箱子当然是来装东西的啦,装什么呢?
第二,HttpRunTime 创建了一个 Request 对象,包含了 IIS 传递给它的所有信息(IIS 传递过来的实际就是个 Request 嘛)。
第三,HttpRunTime 接着又创建了一个 Response 对象,用来装 HTML 的,也放进箱子(Context)
第四,然后,HttpRunTime 说,太累了,这活儿没个干,还是雇个人吧。就找到了 HttpApplication Factory 公司要了一个项目经理 (HttpApplication 对象),然后就把箱子(Context) 交给项目经理并且对它说,这里有我们收到的 Request,你需要做的就是把 里面的 Reponse 填一下,具体怎么干你掂量着吧,就走了。
这个项目经理 (HttpApplication 对象) 就想啊,凭啥活儿我干钱你们拿啊? 不行,我得找俩苦力去,于是就有了:程序员 HttpModule 和程序员 HttpHandler,姑且就称他们为 P_Module 和 P_Handler 吧,项目经理先找到了 P_Module,并且给予了 p_Module 足够大的权力,P_Module(HttpModule)非常的能 干,它能够去查看 HttpRunTime 交给项目经理 (HttpApplication 对象) 的箱子 (Context),并且根据里面的东西做一些决定,比如安全啊 (FormsAuthenticationModule), 状态啊(SessionStateModule) 等等吧。在 P_Module 工作完成之后 (也许已经改变了箱子里(Context) 的内容),然后他就转交给他的副手 P_Handler 来做填充 Response 的工作。可是啊,想找个合适的 P_Handle 也很难啊,找了好久也没找到,好吧,找猎头 (HttpHandler Factory) 吧。猎头公司一看,“ 噢,要.aspx Handler 啊 ", 于是找来了一个天生就善于并且愿意处理页面的 P_Handler,所以呢 P_Module 就把自己处理过的箱子交给它并且说:" 处理 一下这个箱子里的东西,然后交给我 "。
P_Handler 是个天生的处理页面的牛人,它根据 Request 对象里的东西是用 了一招 " 乾坤大挪移 ",不知道怎么挪的,就挪出了 HTML 并塞进了 Response 对象中。P_Handler 自信的笑了一声,把箱子交还给了 HttpModule。然后呢再一层一层的把这个箱子向上传递【不能越级啊,每个人都有自己顶头上司,只能把箱子交给自己的顶头上司】,最后就传给了 IIS,IIS 又给了你了,你就看到这篇文章了。
故事就是故事,故事就是故去的事,就是往事。那往事肯定就有遗漏的地方。那我们这个故事遗漏了哪些地方呢?
第一,IIS 和 ASP.NET 之间的交互不是像我说的那么简单而直接的,中间还发生了很多事情。
第二,HttpModule,也就是我们的程序员 P_Module, 它其实还能干很多事情,我们并没有去发掘。
第三,HttpHandler,也就是我们的程序员 P_Handler,它的 " 乾坤大挪移 " 就是 ProcessRequest 方法,这里并没有详述到。

正文完