`
tomhibolu
  • 浏览: 1387339 次
文章分类
社区版块
存档分类
最新评论

ASP.NET 2.0运行时简要分析

 
阅读更多

概述:
本文基于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

请求处理简要流程图:


阅读建议:
用Reflector工具边查看ASP.NET 2.0的源代码边阅读。

分析:
当我们通过浏览器向ASP.NET 2.0网站的一个asp.net页面发起请求时,在服务器端首先是IIS收到请求,IIS一看是asp.net页面,心里很开心,因为这个请求不用它处理,交给ASP.NET ISAPI就行了。ASP.NET ISAPI的工作也比较轻松,他的主要任务就是安排aspnet_wp.exe处理请求,并监视aspnet_wp.exe进程的执行情况,如果aspnet_wp.exe进程太累了,不能出色地完成任务,ASP.NET ISAPI就要让他下岗,换一个新的aspnet_wp.exe来处理工作。
aspnet_wp.exe的主要任务是将请求交给一系列称为的 HTTP 管道的托管对象。如果把ASP.NET ISAPI比做销售经理,那aspnet_wp.exe就是生产经理,而HTTP 管道就是生产的流水线。负责流水线的小组就是HttpRuntime,生产经理aspnet_wp.exe会将订单(HTTP请求)交给HttpRuntime小组的工作人员ProcessRequest(HttpWorkerRequest wr),HttpRuntime根据内部的分工,最终由ProcessRequestInternal(HttpWorkerRequest wr)在流水线上进行生产,所以ProcessRequestInternal(HttpWorkerRequest wr)是我们分析的重点。

ProcessRequestInternal的主要工作是:
1.创建HttpContext实例。

2.对第一次请求进行初始化(EnsureFirstRequestInit)。
a)在EnsureFirstRequestInit中通过调用System.Web.HttpRuntime.FirstRequestInit进行一些初始化工作,比如:将Web.Config配置读到到RuntimeConfig中,从bin目录中装载所有dll文件。

3.创建HttpWriter实例。

4.通过调用HttpApplicationFactory.GetApplicationInstance创建HttpApplication实例。
在HttpApplicationFactory.GetApplicationInstance中有三个关键方法:
HttpApplicationFactory._theApplicationFactory.EnsureInited();
HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(context);
HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(context);

下面我们对这三个方法逐个进行分析:
1)HttpApplicationFactory._theApplicationFactory.EnsureInited();
该方法检查HttpApplicationFactory是否被初始化,如果没有,就通过HttpApplicationFactory.Init()进行初始化。
在Init()中,先获取global.asax文件的完整路径,然后调用CompileApplication()对global.asax进行编译。
那编译是如何进行的呢?
编译的工作由BuildManager完成的。BuildManager先得到GlobalAsaxType(也就是HttpApplication),然后调用BuildManager.GetGlobalAsaxBuildResult()=》GetGlobalAsaxBuildResultInternal()=》EnsureTopLevelFilesCompiled()进行编译。
在EnsureTopLevelFilesCompiled中,先进行CompilationStage.TopLevelFiles编译,对下面三个目录中的文件进行编译:
a.CompileResourcesDirectory();
编译App_GlobalResources目录。
b.CompileWebRefDirectory();
编译App_WebReferences目录。
c.CompileCodeDirectories();
编译App_Code目录。

接着进行CompilationStage.GlobalAsax 编译,对global.asax进行编译,方法调用情况:CompileGlobalAsax()=》ApplicationBuildProvider.GetGlobalAsaxBuildResult(BuildManager.IsPrecompiledApp)。
在GetGlobalAsaxBuildResult中具体的编译是由ApplicationBuildProvider与BuildProvidersCompiler共同完成的。
BuildProvidersCompiler.PerformBuild();进行编译工作。
ApplicationBuildProvider.GetBuildResult得到编译的结果。
编译成功后,会在C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/相应的目录中生成类似App_global.asax.mlgx7n2v.dll的dll文件。
编译生成的类名为ASP.global_asax,继承自HttpApplication。
注:如果Web目录中没有Global.asax文件,就不会编译生成App_global.asax.mlgx7n2v.dll这样的文件。

2)HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(context);
创建特定的HttpApplication实例,触发ApplicationOnStart事件,执行ASP.global_asax中的Application_Start(object sender, EventArgs e)方法。这里创建的HttpApplication实例在处理完事件后,就被回收。

3)HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(context);
该方法创建HttpApplication实例并进行初始化(调用System.Web.HttpApplication. InitInternal()方法)。
创建HttpApplication实例是根据实际的_theApplicationType进行创建。如果Web目录中没有global.asa文件,也就是说没有动态编译生成ASP.global_asax类型,那就直接实例化HttpApplication。如果创建了ASP.global_asax类型,那就对ASP.global_asa进行实例化。

创建HttpApplication实例之后就是调用实例的InitInternal方法。
InitInternal方法也是我们重点分析的方法,该方法的主要功能如下:
1.InitModules():根据Web.Config的设置,创建相应的HttpModules。

2.HookupEventHandlersForAppplicationAndModules:根据发生的事件,调用HttpApplication实例中相应的事件处理函数。

3.创建很多实现IExecutionStep接口的类的实例并添加到当前HttpApplication实例的_execSteps中,等待回调时执行。从这里我们可以看到HttpApplication是以异步的方式处理请求,对请求的很多处理工作都放入了_execStep等待回调时执行。
_execStep中主要的处理工作如下:
1)对请求的路径进行安全检查,禁止非法路径访问(ValidatePathExecutionStep)。
2)如果设置了UrlMappings, 进行RewritePath(UrlMappingsExecutionStep)。
3)执行事件处理函数,比如:BeginRequest、AuthenticateRequest等等。
4)获取处理当前请求的HttpHandler,ASP.NET页面的动态编译也是在这里进行的。(MapHandlerExecutionStep)
该处理是通过调用System.Web.HttpApplication. MapHttpHandler方法。
在MapHttpHandler中,首先根据访问的地址从web.config获取相应的实现IHttpHandlerFactory的类型。对于asp.net页面,默认是PageHanlderFactory。然后创建PageHanlderFactory实例,调用GetHandlerHelper,在GetHandlerHelper中调用BuildManager.CreateInstanceFromVirtualPath编译并创建当前请求的ASP.NET页面的实例(如果已经编译过,直接从缓存中加载)。
CreateInstanceFromVirtualPath经过几次方法调用,将编译任务给了BuildManager. CompileWebFile()。CompileWebFile从web.config得到相应的BuildProvider,对于.aspx文件,相应的BuildProvider是PageBuildProvider。PageBuildProvider是如何进行页面编译的,这里就不再就进一步分析了,如果你感兴趣,可以进一步研究ASP.NET 2.0的源代码。
5)调用相应HttpHandler的.ProcessRequest方法处理请求(如果是异步方式,调用BeginProcessReques)。(CallHandlerExecutionStep)
6)将响应内容写入Filter。(CallFilterExecutionStep)

5. 调用HttpApplication实例的BeginProcessRequest异步处理请求。
上面所讲的_execSteps中所发生的许多事情,都是在HttpRuntime调用HttpApplication BeginProcessRequest之后,在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运行时而写的,欢迎你对文章内容提出批评与建议。
我觉得写文章,不仅能提高自己的写作水平、方便交流,而且通过写文章,可以理清自己的思路、促进自己深入地思考从而加深自己对技术的理解,开发人员在编码之余抽点时间写些技术文章对提高自己还是很有帮助的。

分享到:
评论

相关推荐

    ASP.NET 2.0运行原理及其过程简要分析

    ASP.NET 2.0运行原理及其过程简要分析

    ASP[1].NET+2.0动态网站开发教程

    第一部分介绍ASP.NET 2.0的基础知识,包括.NET框架的体系结构、ASPX网页的运行机制、验证控件的使用以及相关的浏览器技术。第二部分介绍了数据访伺技术,包括ADO.NET的系统结构,对数据库的连接、显示、编辑与...

    asp.net2.0开发基础

    本资源网站介绍了ASP.NET 2.0开发核心技术, 这些源代码均使用Visual Studio 2005正式版和C# 2.0语言编写调试。 可通过单击页面左侧树形列表,按照章节名称选择使用。 对于每一个具体的示例源代码,必须首先下载...

    论文研究-基于ASP.NET 2.0的登录控制应用研究 .pdf

    基于ASP.NET 2.0的登录控制应用研究,邢诒俊,范春晓,对于大多数Web应用程序来说,身份验证和登录安全控制是非常重要的部分,也是Web应用程序的开发难点。本文将简要介绍ASP.NET 2.0中的成�

    .NET2.0 开发模式应用

    《使用 Microsoft .NET 的企业解决方案模式》。本指南简要介绍了各种模式,并描述一个按照各种视点和关系对它们进行分类的新组织方法,随后,本指南讨论了其中几个视点所涉及的 32 种模式,并解释了如何将它们集成到...

    Programming ASP.NET 中文版(第3版).rar

    《Programming ASP.NET 中文版(第3版)》首先简要介绍了ASP.NET 2.0 和 Visual Studio 2005,这样可以很快地提高你的工作效率。本书前面的章节深入介绍了控件、事件、ASP.NET web页的生命周期以及其他一些使用ASP.NET...

    Programming ASP.NET 中文版(第3版)

    《Programming ASP.NET 中文版(第3版)》首先简要介绍了ASP.NET 2.0 和 Visual Studio 2005,这样可以很快地提高你的工作效率。本书前面的章节深入介绍了控件、事件、ASP.NET web页的生命周期以及其他一些使用ASP.NET...

    Programming.ASP.NET.中文版(第3版)

    《Programming ASP.NET》首先简要介绍了ASP.NET 2.0 和 Visual Studio 2005,这样可以很快地提高你的工作效率。本书前面的章节深入介绍了控件、事件、ASP.NET web页的生命周期以及其他一些使用ASP.NET框架的基本概念...

    OA服务器架设

    4、运行setup.exe,缺省安装在“c:\anyoffice.net”,安装完成后,通过IIS新建OA站点,OA站点主目录设置为安装目录下“anyoffice.net\webfoot”,站点默认文档设置为index.aspx,更改站点ASP.NET版本为2.0.50727。...

    Mastering-ASP.NET-Core-2.0:精通ASP.NET Core 2.0,由Packt发布

    掌握ASP.NET Core 2.0 这是发行的的代码存储库。 它包含从头到尾完成本书所必需的所有支持项目文件。 关于这本书 ASP.NET是一个开放源代码的Web框架,可构建现代的Web应用程序和服务。 本书是ASP.NET Core 2.0新...

    ASP.NET3.5完全自学手册源码

    《Asp.NET3.5完全自学手册》适合于任何想要学习ASP.NET3.5的初学者,对于具有一定的ASP.NET1.1或者2.0基础的应用开发人员,通过《Asp.NET3.5完全自学手册》的学习可以更加全面地了解ASP.NET3.5技术。

    ASP.NET 3.5从入门到精通(C#2008版)

    《ASP.NET3.5从入门到精通(C#2008版)》假定读者只具有基本的C#语言知识,因此在《ASP.NET3.5从入门到精通(C#2008版)》的开始部分将对C#进行简要的介绍,具有较多C#编程经验的人也可以将这些基础性的介绍作为一个快速...

    依据ASP.NET通用作业批改系统毕业设计(源代码+论文)

    该系统采用B/S结构,以浏览器方式登陆系统,用ASP.NET作为开发语言,数据库则使用Microsoft SQL Server 2000实现。《通用作业批改系统》包括了学生子系统、教师子系统、管理员子系统三大模块,该系统主要完成学生,...

    二手C2C asp.net代码

    发布网站简要公告 2.用户管理--后台添加用户,察看用户信息,删除用户 3.信息管理--察看信息基本属性,删除信息 4.留言板管理--回复和删除留言 5.网站日志管理--记录和删除网站事件 6.信息分类管理--完善的分类...

    ASP.NET Core自定义本地化教程之从文本文件读取本地化字符串

    本文先简要介绍在ASP.NET Core 2.0里实施全球化和本地化,默认的本地化从资源文件(resx)里读取本地化字符串。本文然后提供一个简单示例,说明如何自定义本地化,以便从文本文件读取本地化字符串。 实施全球化和...

    vcg(验证码控件)

    在IIS管理器中将网站属性的ASP.NET version选中为2.0,并在网站虚拟目录属性的“安全”选项卡中添加ASP.NET用户,赋予写入权限; b) 在Microsoft Visual Studio 2005中打开相应的网站,并打开相应的aspx页面文件...

    实现类似Office助手的小精灵

    分类:前沿技术 神.NET (2001-10-14 17:54:00) skylove,把MS Agent在网页中调用的所有动作的中文说明贴出来吧!我给你200分 还有如果不介意的话,请告诉我你的电子邮件地址和你的QQ号码 YB_unique (2001-...

Global site tag (gtag.js) - Google Analytics