Asp.Net生命周期系列一
Asp.Net生命周期对于初级甚至中级程序员来说,一直都是一个难题,很多程序员不了解生命周期,导致使用Asp.Net做开发感觉很不灵活,感觉太多东西被微软封装好了,我们不能改变,其实只要你稍微了解一下就知道,原来不是这样的!
我写这一系列文章是采用总分的方式,先让大家整体了解,然后再逐一突破。先将一个故事,也是园子里看到的(http://www.cnblogs.com/GodSpeed/archive/2010/06/19/1761095.html),我认为这个写的有些细节上的错误,稍稍添加些自己的想法和理解,如有错误,还请留言!
当你访问博客园想看我的这篇文章的时候,这个请求就被博客园的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方法,这里并没有详述到。
第四,。。。等我再想想再跟您聊。
希望这边小文能够帮助你更容易的理解ASP.NET生命周期,我会继续努力,争取以最简单明了的方式来speak out ASP.NET原理和运行机制。欢迎拍砖,谢谢。
Asp.Net生命周期系列一的更多相关文章
- Asp.Net生命周期系列三
上文讲到了HttpRunTime主要做了三个事情,我们先回忆一下. 第一:雇佣了项目经理(HttpApplication). 第二:建立了HttpModule列表,项目经理(HttpRunTime)就 ...
- Asp.Net生命周期系列四
上回我们说的当一个Http请求来到HttpModule这里的时候,Asp.Net内部并未对这个Http请求做出任何的处理,我们可以对这个Http请求添加一些我们需要的信息,以方便我们控制这个Http请 ...
- Asp.Net生命周期系列五
如果您看了我的前四篇文章,应该知道目前Http请求已经流到了HttpModule这个程序员手中了,而且我们可以注册自己的HttpModule并且可以在里面注册一些事件来控制这个Http请求,但是到目前 ...
- (转)Asp.Net生命周期系列五
原文地址:http://www.cnblogs.com/skm-blog/p/3188697.html 如果您看了我的前四篇文章,应该知道目前Http请求已经流到了HttpModule这个程序员手中了 ...
- (转)Asp.Net生命周期系列三
原文地址:http://www.cnblogs.com/skm-blog/p/3178862.html 上文讲到了HttpRunTime主要做了三个事情,我们先回忆一下. 第一:雇佣了项目经理(Htt ...
- Asp.Net生命周期系列二
在上回书开始的时候我们提到博客园的IIS看了一眼我的请求后就直接交给ASP.NET去处理了,并且要求ASP.NET处理完之后返回HTML以供展示. 那么我们不仅要问: 1, IIS肯定是没有眼睛 ...
- Asp.Net生命周期系列六
上篇说到当一个Http请求流到HttpHandler这里时才开始对它的处理,那么一个请求经过HttpHandler之后, 到底怎么对它处理呢,也就是说HttpHandler会触发哪些事件,触发的顺序如 ...
- (转)Asp.Net生命周期系列一
原文地址:http://www.cnblogs.com/skm-blog/archive/2013/07/07/3176713.html Asp.Net生命周期对于初级甚至中级程序员来说,一直都是一个 ...
- Asp.Net复习篇之Asp.Net生命周期与Asp.Net页的生命周期
Asp.Net生命周期与Asp.Net页的生命周期是一个比较重要的话题,有时可能似乎知道一些,但又说不出个所以然,而且时常把这两个概念混淆.现在也是该好好理清思路,把这两个概念搞懂. Asp.Net生 ...
随机推荐
- 看我如何使用IDEA引入GitHub上的Maven项目,从Clone到打开,图文步骤,你绝对看的懂!!
废话不多说,就一个字:干! 1.登录GitHub,复制项目仓库的地址 2.打开IDEA,选择git(三种方式选择) 第一种方式: 第二种方式: 第三种方式: 选择git后 3.下面是我改存放的目录 正 ...
- vim删除文件所有内容
在命令模式下,输入:.,$d 回车.
- 一个关于 json ,加密,测试,集多功能为一体的在线工具
很多情况下我们会序列化json或者解析json,那么要解析json也许使用json实体类会好很多,或者你有时候需要压缩转义json的时候, 有一个网站真的是非常好用,里面什么都有......是真的啥都 ...
- LintCode 7.Serialize and Deserialize Binary Tree(含测试代码)
题目描述 设计一个算法,并编写代码来序列化和反序列化二叉树.将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”. 如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将 ...
- 通过Ops Manager安装管理mongodb-3.4集群
node1 Ops Manager,mongodb,agent node2 mongodb,agent node3 mongodb,agent 参考文档 https://docs.opsmanager ...
- CentOS7.2中安装MongoDB
MongoDB是由C++编写的NoSQL的分布式文件数据库,用的json格式的k-value存储方式. MongoDB官网 https://www.mongodb.com 一.下载和安装 下载完后文件 ...
- css跨浏览器大全
CSS技巧1.div的垂直居中问题 vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了.缺点是要控制内容不要 ...
- C#正则表达式Regex类的使用
C#中为正则表达式的使用提供了非常强大的功能,这就是Regex类.这个包包含于System.Text.RegularExpressions命名空间下面,而这个命名空间所在DLL基本上在所有的项目模板中 ...
- Java基础——继承和多态
面向对象的编程允许从已经存在的类中定义新的类,这称为继承. 面向过程的范式重点在于方法的设计,而面向对象的范式将数据和方法结合在对象中.面向对象范式的软件设计着重于对象以及对象上的操作.面向对象的方法 ...
- 分享一个根据具体的日期判断星座的PHP函数
其实原理很简单,也就是把所有的星座月份日期范围存储到一个数组中,然后根据日期判断属于哪个范围,这样就得到是哪个星座了. 下面的这个函数写的比较精炼,可以参考一下 function constellat ...