More Related Content
Similar to Asp.Net运行时 (20)
More from jason hu 金良胡 (20)
Asp.Net运行时
- 1. dd
uu
为程序员打杂的站长
人生的真正价值在于从何种程度与何种意义
博客园 首页 新随笔 联系 管理 订阅 随笔- 992 文章- 236 评论- 19537 上摆脱自我!
爱因斯坦
我的最新闪存
ASP.NET 2.0运行时简要分析 精简了博客后台编辑器按钮。 3-25 21:37
概述:
本文基于ASP.NET 2.0的源代码,对ASP.NET 2.0运行时进行了简要的分析,希望能帮助你理解ASP.NET
2.0中请求处理过程及页面编译模型。
常用链接
关键字:
ASP.NET 2.0运行时,原理,请求处理,页面编译,ASP.NET 2.0 HTTP Runtime 我的随笔
我的小组
主要类: 我的闪存
System.Web.HttpRuntime 我的好友
System.Web.HttpApplicationFactory 更多链接
System.Web.HttpApplication
System.Web.Compilation.BuildManager
System.Web.Compilation.ApplicationBuildProvider
留言簿
System.Web.Compilation.BuildProvidersCompiler 给我留言
System.Web.UI.PageHandlerFactory 查看留言
请求处理简要流程图:
我管理的小组
程序员音乐空间
创业交流
LumaQQ.NET
博客园上海俱乐部
英语听力
Web技术联盟
博客文摘
我参加的小组
读书(Books)
web标准设计
ASP.NET
你必须知道的.NET
08欧锦赛
Visual Studio
博皮小组
Debug 探索团队小组
设计师之家
ubuntu
我参与的团队
Design & Pattern团队(0/699)
SharePoint团队(0/612)
.NET新手training活动(0/428)
上海.NET俱乐部(0/1874)
北京.NET俱乐部(0/927)
MVP团队(0/367)
博客园NBear团队(0/48)
博客园创业者(0/19)
Debug 探索团队(0/15)
随笔分类
ASP.NET 1.1(14) (rss)
ASP.NET 2.0(13) (rss)
C#(14) (rss)
- 2. 阅读建议: SharePoint(17) (rss)
用Reflector工具边查看ASP.NET 2.0的源代码边阅读。 VS2005(8) (rss)
WCF(1) (rss)
分析: 博客系统开发(1) (rss)
当我们通过浏览器向ASP.NET 2.0网站的一个asp.net页面发起请求时,在服务器端首先是IIS收到请求,IIS 博客园活动(1) (rss)
一看是asp.net页面,心里很开心,因为这个请求不用它处理,交给ASP.NET ISAPI就行了。ASP.NET ISAPI的工 创业(6) (rss)
电脑使用经验(19) (rss)
作也比较轻松,他的主要任务就是安排aspnet_wp.exe处理请求,并监视aspnet_wp.exe进程的执行情况,如果a
开源(5) (rss)
spnet_wp.exe进程太累了,不能出色地完成任务,ASP.NET ISAPI就要让他下岗,换一个新的aspnet_wp.exe
媒体报道(3) (rss)
来处理工作。
生活随笔(4) (rss)
aspnet_wp.exe的主要任务是将请求交给一系列称为的 HTTP 管道的托管对象。如果把ASP.NET ISAPI比做
书籍(1) (rss)
销售经理,那aspnet_wp.exe就是生产经理,而HTTP 管道就是生产的流水线。负责流水线的小组就是HttpRunti
数据库技术(3) (rss)
me,生产经理aspnet_wp.exe会将订单(HTTP请求)交给HttpRuntime小组的工作人员ProcessRequest(HttpW 网站功能发布(70) (rss)
orkerRequest wr),HttpRuntime根据内部的分工,最终由ProcessRequestInternal(HttpWorkerRequest w 网站管理(164) (rss)
r)在流水线上进行生产,所以ProcessRequestInternal(HttpWorkerRequest wr)是我们分析的重点。 网站性能优化(4) (rss)
ProcessRequestInternal的主要工作是:
1. 创建HttpContext实例。 随笔档案
2008年3月 (14)
2. 对第一次请求进行初始化(EnsureFirstRequestInit)。
2008年2月 (7)
a) 在EnsureFirstRequestInit中通过调用System.Web.HttpRuntime.FirstRequestInit进行一些初始化工作,
2008年1月 (9)
比如:将Web.Config配置读到到RuntimeConfig中,从bin目录中装载所有dll文件。 2007年12月 (11)
2007年11月 (12)
3. 创建HttpWriter实例。 2007年10月 (13)
2007年9月 (7)
4. 通过调用HttpApplicationFactory.GetApplicationInstance创建HttpApplication实例。 2007年8月 (14)
在HttpApplicationFactory.GetApplicationInstance中有三个关键方法: 2007年7月 (16)
HttpApplicationFactory._theApplicationFactory.EnsureInited(); 2007年6月 (13)
HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(context); 2007年5月 (11)
HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(context); 2007年4月 (6)
2007年3月 (14)
下面我们对这三个方法逐个进行分析: 2007年2月 (12)
1) HttpApplicationFactory._theApplicationFactory.EnsureInited(); 2007年1月 (15)
该方法检查HttpApplicationFactory是否被初始化,如果没有,就通过HttpApplicationFactory.Init()进行初 2006年12月 (18)
始化。 2006年11月 (26)
在Init()中,先获取global.asax文件的完整路径,然后调用CompileApplication()对global.asax进行编译。 2006年10月 (20)
那编译是如何进行的呢? 2006年9月 (18)
编译的工作由BuildManager完成的。BuildManager先得到GlobalAsaxType(也就是HttpApplication),然 2006年8月 (23)
后调用BuildManager.GetGlobalAsaxBuildResult()=》GetGlobalAsaxBuildResultInternal()=》Ensur 2006年7月 (17)
eTopLevelFilesCompiled()进行编译。 2006年6月 (8)
2006年5月 (23)
在EnsureTopLevelFilesCompiled中,先进行CompilationStage.TopLevelFiles编译,对下面三个目录中的
2006年4月 (10)
文件进行编译:
2006年3月 (16)
a. CompileResourcesDirectory();
2006年2月 (17)
编译App_GlobalResources目录。
2006年1月 (9)
b. CompileWebRefDirectory(); 2005年12月 (13)
编译App_WebReferences目录。 2005年11月 (9)
c. CompileCodeDirectories(); 2005年10月 (19)
编译App_Code目录。 2005年9月 (11)
2005年8月 (24)
接着进行CompilationStage.GlobalAsax 编译,对global.asax进行编译,方法调用情况:CompileGlobalA
2005年7月 (35)
sax()=》ApplicationBuildProvider.GetGlobalAsaxBuildResult(BuildManager.IsPrecompiledApp)。
2005年6月 (23)
在GetGlobalAsaxBuildResult中具体的编译是由ApplicationBuildProvider与BuildProvidersCompiler共同 2005年5月 (11)
完成的。 2005年4月 (21)
BuildProvidersCompiler.PerformBuild();进行编译工作。 2005年3月 (32)
ApplicationBuildProvider.GetBuildResult得到编译的结果。 2005年2月 (19)
编译成功后,会在C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET File 2005年1月 (23)
s相应的目录中生成类似App_global.asax.mlgx7n2v.dll的dll文件。 2004年12月 (35)
编译生成的类名为ASP.global_asax,继承自HttpApplication。 2004年11月 (24)
注:如果Web目录中没有Global.asax文件,就不会编译生成App_global.asax.mlgx7n2v.dll这样的文件。 2004年10月 (19)
2004年9月 (25)
2) HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(context); 2004年8月 (35)
创建特定的HttpApplication实例,触发ApplicationOnStart事件,执行ASP.global_asax中的Application_ 2004年7月 (30)
Start(object sender, EventArgs e)方法。这里创建的HttpApplication实例在处理完事件后,就被回收。 2004年6月 (24)
2004年5月 (17)
3) HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(context); 2004年4月 (9)
该 方法创建HttpApplication实例并进行初始化(调用System.Web.HttpApplication. InitInternal()方法)。 2004年3月 (57)
创建HttpApplication实例是根据实际的_theApplicationType进行创建。如果Web目录中没有global.asa文件, 2004年2月 (61)
也就是说没有动态编译生成ASP.global_asax类型,那就直接实例化HttpApplication。如果创建了ASP.global_a 2004年1月 (32)
sax类型,那就对ASP.global_asa进行实例化。
创建HttpApplication实例之后就是调用实例的InitInternal方法。 新闻分类
InitInternal方法也是我们重点分析的方法,该方法的主要功能如下:
创业(17) (rss)
1. InitModules():根据Web.Config的设置,创建相应的HttpModules。
- 3. 2. HookupEventHandlersForAppplicationAndModules:根据发生的事件,调用HttpApplication实例中相应的
事件处理函数。
相册
Imagination Festival 2007
3. 创建很多实现IExecutionStep接口的类的实例并添加到当前HttpApplication实例的_execSteps中,等待回调 TechED 2005
时执行。从这里我们可以看到HttpApplication是以异步的方式处理请求,对请求的很多处理工作都放入了_execSt TechEd 2006
ep等待回调时执行。 TechEd2007
_execStep中主要的处理工作如下: 广州沙龙活动
1) 对请求的路径进行安全检查,禁止非法路径访问(ValidatePathExecutionStep)。 桌面
2) 如果设置了UrlMappings, 进行RewritePath(UrlMappingsExecutionStep)。
3) 执行事件处理函数,比如:BeginRequest、AuthenticateRequest等等。
4) 获取处理当前请求的HttpHandler,ASP.NET页面的动态编译也是在这里进行的。(MapHandlerExecutionSte 朋友的博客
p) Allen Lee
该处理是通过调用System.Web.HttpApplication. MapHttpHandler方法。 briansun
在MapHttpHandler中,首先根据访问的地址从web.config获取相应的实现IHttpHandlerFactory的类型。对于as Bruce Zhang
p.net页面,默认是PageHanlderFactory。然后创建PageHanlderFactory实例,调用GetHandlerHelper,在G CHUN
etHandlerHelper中调用BuildManager.CreateInstanceFromVirtualPath编译并创建当前请求的ASP.NET页面 Dflying Chen
的实例(如果已经编译过,直接从缓存中加载)。 FantasySoft
CreateInstanceFromVirtualPath经过几次方法调用,将编译任务给了BuildManager. CompileWebFile()。Co idior
mpileWebFile从web.config得到相应的BuildProvider,对于.aspx文件,相应的BuildProvider是PageBuildPro lemeng
vider。PageBuildProvider是如何进行页面编译的,这里就不再就进一步分析了,如果你感兴趣,可以进一步研究 Pedro Serrano
ASP.NET 2.0的源代码。 Robert J.T. Yan
5) 调用相应HttpHandler的.ProcessRequest方法处理请求(如果是异步方式,调用BeginProcessReques)。(C simonw
allHandlerExecutionStep) sulzbach
6) 将响应内容写入Filter。(CallFilterExecutionStep) Teddy
xuebin
5. 调用HttpApplication实例的BeginProcessRequest异步处理请求。 Yeka
上面所讲的_execSteps中所发生的许多事情,都是在HttpRuntime调用HttpApplication BeginProcessReq 阿诺
uest之后,在BeginProcessRequest中调用ResumeSteps后执行的。 怪怪
韩磊
ASP.NET 2.0运行时是ASP.NET 2.0中非常复杂、难以理解也是很重要的部分,对ASP.NET 2.0运行时源代码 老燕
的研究有处于我们加深对ASP.NET 2.0原理的理解,会给我们开发ASP.NET 2.0应用程序带来不少帮助。这篇文章 雷钧随想
是我初次学习ASP.NET 2.0运行时,为了帮助自己更好地理解ASP.NET 2.0运行时而写的,欢迎你对文章内容提出 临风听暮禅
批评与建议。 灵感之源
我觉得写文章,不仅能提高自己的写作水平、方便交流,而且通过写文章,可以理清自己的思路、促进自己深入 吕震宇
地思考从而加深自己对技术的理解,开发人员在编码之余抽点时间写些技术文章对提高自己还是很有帮助的。 双鱼座
维生素C.net
我是坏女生
posted @ 2006-01-14 00:23 dudu 阅读(5472) 评论(15) 编辑 收藏 所属分类: ASP.NET 2.0
心仪
发表评论 网站收藏
#1楼 2006-01-14 09:17 | 木野狐 回复 引用 查看 codeproject
DoNews
dotnet.org.za
写的很形象,谢谢 dudu. 收藏下来有空慢慢对照源码研究去。 dotnetjunkies.com
joelonsoftware
博客堂
#2楼 2006-01-14 10:57 | jiangws 回复 引用 查看 沪江英语
苹果树下的童话
译言
写得很好,特别是:我觉得写文章,不仅能提高自己的写作水平、方便交流,而且通过写文章,可以理清自己的思
路、促进自己深入地思考从而加深自己对技术的理解,开发人员在编码之余抽点时间写些技术文章对提高自己还
是很有帮助的。 小组
博客园在facebook
#3楼 2006-01-14 15:46 | 阳春三月 回复 引用 查看
博客园在豆瓣
博客园在沪江
不错,这个形象很比喻。
刚开始接触一项新的技术时,尤其是能成 面 或成 体 的显得庞大复杂的新技术,由老师提纲挈领把大框架
友情链接
讲解一遍,对学习是非常有帮助的。这样的讲解不用太长,可能几句说到点子上的话就够了,就像本文 分析
Qihangnet
部分打比方的那两段,言简意赅,简明扼要,一下子就把 ASP.Net 页面是怎么运行起来的讲透了,而且准确生
捐献时间、分享快乐
动,颇有些幽默感。希望我们都能写出这样的文字来。
#4楼 2006-01-14 17:33 | 火星撞地球 [未注册用户] 回复 引用 查看 最新随笔
1. 摘要功能小改进
被你抢了先了 我正准备也写一篇这样的文章呢 :) 2. 好想好想
3. 欢迎大家推荐对自己最有帮助的技术图
书
#5楼 2006-01-17 13:16 | A.Z [未注册用户] 回复 引用 查看 4. 新模板发布-coffee
5. 博客园博客程序架构设计图初稿
6. 闪存与博客的整合
7. 社区与博客的进一步整合
- 4. 8. [公告]社区与博客实现了登录整合
9. 程序员音乐空间
HookupEventHandlersForAppplicationAndModules
10. 耐心
多了一个p
11. 网速调查
12. 热烈欢迎两位园友加盟
#6楼 [楼主 ]2006-01-17 14:08 | dudu 回复 引用 查看
13. 遥远的路
14. 《环球企业家》:鲍尔默的独角戏
15. 聊聊今年的春节联欢晚会
@A.Z
源代码中的确就是这样写的。 16. 祝大家新年快乐
17. [收藏]《观察与思考》:相信中国,寻
找下一个比尔·盖茨
#7楼 2006-07-18 19:25 | xin 回复 引用 查看
18. [建议讨论话题]微软出价446亿美元洽
购雅虎
你好!我完全看不懂,在这想请你提供点关于这方面的基础学习建意和资料.谢谢! 19. 百度年会
Email:spsuxin#gmail.com 20. 博客园上海俱乐部第二次活动继续报道
#8楼 2006-11-24 09:20 | g無s所p畏 回复 引用 查看 搜索
搜索
要想学好asp.net,我看真得把这些东西搞懂搞透才行
#9楼 2007-01-24 08:46 | 小雨 [未注册用户] 回复 引用 查看
最新评论
1. re: 欢迎大家推荐对自己最有帮助的技
术图书
我觉得写文章,不仅能提高自己的写作水平、方便交流,而且通过写文章,可以理清自己的思路、促进自己深入
书名:《Object-Oriented Analysis and
地思考从而加深自己对技术的理解,开发人员在编码之余抽点时间写些技术文章对提高自己还是很有帮助的。
Design》作者:Grady Booch, Robert
A. Maksimchuk, Michael W. Engel,
写的太好了
a... (Anders小明)
#10楼 [TrackBack]2007-03-09 16:30 | daizhj 回复 引用 查看 2. re: 好想好想
路过,感受下····· (BirdsHover)
最近有时间看一些.net的框架代码,发现一个有意思的问题,就是HttpModule中的Init函数下的事件绑定,因为 3. re: 好想好想
事件的绑定在事件发生后相应 感受到春天的气息了。。。 (Anders Cui)
[引用提示]daizhj引用了该文章, 地址:
4. re: 申请加入博客园创业者团队博客
http://www.cnblogs.com/daizhj/archive/2007/03/09/669479.html
开始创业哦。一起交流一下
博客园帐户名:lyj
#11楼 [TrackBack]2007-03-09 16:33 | daizhj 回复 引用 查看 博客地址: (李永京)
5. re: 摘要功能小改进
最近有时间看一些.net的框架代码,发现一个有意思的问题,就是HttpModule中的Init函数下的事件绑定,因为 非常使用的功能哦! (Vitamin_C)
事件的绑定在事件发生后相应
[引用提示]daizhj引用了该文章, 地址: http://www.cnblogs.com/daizhj/articles/669479.html 6. re: 好想好想
--引用-----------------------------------
#12楼 2007-05-20 09:25 | sdhjl2000 [未注册用户] 回复 引用 查看 ---------------杨正祎(阿一): 文章简介中
图片那么暧昧,还以为老大想像图片中那样
呢。 -_-b....--... (lzppcc)
dudu语文看来学的不错,比喻很生动!thanks
7. re: 欢迎大家推荐对自己最有帮助的技
术图书
书名:《C# 2.0宝典》作者:张立出版
#13楼 [TrackBack]2007-08-22 20:51 | appledou 回复 引用 查看
社:电子工业出版社; 书名:《圣殿祭司
的ASP.NET 2.0开发详解 使用C#》作
Trace:http://www.cnblogs.com/dudu/archive/2006/01/14/317016.html概述: 者:奚江华 出版社:电子工业出版社 书
[引用提示]appledou引用了该文章, 地址: http://www.cnblogs.com/txdlf/articles/865971.html 名:《深入浅出设计模式... (侯垒)
8. re: 摘要功能小改进
#14楼 [TrackBack]2007-11-17 23:46 | dyq 回复 引用 查看 原来右侧图片是要自己敲代码的啊!
这个功能very nice (随风逝去)
概述: 9. re: 摘要功能小改进
[引用提示]dyq引用了该文章, 地址: 很喜欢这个功能 (sekihin)
http://www.cnblogs.com/yongqiudeng/archive/2007/11/17/962921.html
10. re: 欢迎大家推荐对自己最有帮助的技
术图书
#15楼 2007-12-07 18:05 | 邓林海 回复 引用 查看
--引用-----------------------------------
--------------- 杨正祎(阿一): 书名:《精
顶 通css》 作者:Andy Budd 译者:陈剑瓯
出版社... (WOW玩家)
刷新评论列表
阅读排行榜
标题 1. 电脑故障处理经验一则(238639)
re: ASP.NET 2.0运行时简要分析
2. 电脑故障处理小经验 IE无法打开链接
姓名 的处理方法(237398)
3. 10 Golden rules for publishing your
- 5. 主页 blog (69793)
4. Windows 2000 常见进程功能描述[转
Email (只有博主才能看到) 帖](65605)
5. 博客园程序源代码下载(59639)
验证码
* 6. 新增的MSN图片(52851)
内容(请不要发表任何与政治相关的内容) 7. 在Windows下配置与使用CVSNT(508
90)
8. 博客园FAQ(39984)
9. 网速测试(27146)
10. 清除SearchNet.exe(26485)
11. 不错的工具:Reflector for .NET (239
04)
12. 如何实现文本框焦点自动跳转及通过回
车键提交表单(21819)
13. 安装智能陈桥五笔时请小心(19385)
14. 日志文件分析工具 AWStats在IIS中
的配置步骤(18774)
15. TortoiseCVS比WinCVS好用多了(18
753)
c
d
e
g Remember Me?
提交 登录 使用高级评论 新用户注册 返回页首 恢复上次提交
评论排行榜
[使用Ctrl+Enter键可以直接提交]
1. 电脑故障处理经验一则(1061)
该文被作者在 2006-08-06 16:09 编辑过
2. [重要新功能]团队Blog(524)
3. 博客园FAQ(382)
历史上的今天:
4. [公告]博客园准备建立SharePoint团队
2004-01-14 可以插入图片了
2004-01-14 如何用w.bloggar从桌面发表文章 (354)
5. 电脑故障处理小经验 IE无法打开链接
的处理方法(345)
所属分类的其他文章:
6. 10 Golden rules for publishing your
· ASP.NET 2.0 X64的奇怪问题
blog (345)
· 博客园Blog程序中又一个奇怪问题
7. 博客园程序源代码下载(278)
· 博客园Blog程序遇到的奇怪问题
8. 网速测试(226)
· 对ASP.NET 2.0的预编译功能有点不满
9. 博客园也Ajax(171)
· 推荐一篇有关Master Pages的文章
10. 哪个城市更适合博客园的发展(167)
· 关于 Ambiguous match found”
· [代码示例]如何在ASP.NET中获取随机生成的cookie加密与验证密钥
· 从ASP.NE T 1.1升级到ASP.NET 2.0需要考虑的Cookie问题
· ASP.NET 2.0, 想说爱你不容易 在ASP.NET 2.0中开发通配符映射应用程序的一些问题
6天内阅读排行
0
· [ASP.NET 2.0]PageParser.GetCompiledPageInstance中的一个Bug及解决方法 1. 博客园博客程序架构设计图初稿(4431)
博客园首页 社区 2. 热烈欢迎两位园友加盟(3581)
3. 聊聊今年的春节联欢晚会(3507)
4. [建议讨论话题]微软出价446亿美元洽购
雅虎(3038)
5. 欢迎大家推荐对自己最有帮助的技术图
书(2846)
6. 博客园上海俱乐部第二次活动继续报道
(2303)
7. 网速调查(2237)
8. 新模板发布-coffee(2062)
9. 祝大家新年快乐(1996)
10. [公告]社区与博客实现了登录整合(19
74)
11. 闪存与博客的整合(1736)
12. 致歉(1607)
13. 致歉(1523)
14. 社区与博客的进一步整合(1479)
15. 《环球企业家》:鲍尔默的独角戏(10
91)
Copyright ©2008 dudu