asp.net运行原理

原创 2012年03月23日 19:45:30

查看IIS的---》应用程序配置中可以看到aspx文件--->映射给了aspnet_isapi.dll文件


主要类:


  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运行原理的很好的文章

[转贴]原贴地址http://www.cnblogs.com/Heroman/archive/2005/05/12/153975.aspx首先先感谢 菩提本非树这一章是全书基础和精神所在,其后的例子章...
  • jilate
  • jilate
  • 2005年07月28日 15:55
  • 3817

ASP.NET运行机制原理

ASP.NET运行机制原理01 ---浏览器与IIS的交互过程 一、浏览器和服务器的交互原理    (一)、浏览器和服务器交互的简单描述: 1.通俗描述:我们平时通过浏览器来访问网站,其实就相...
  • u012968272
  • u012968272
  • 2015年05月06日 01:28
  • 943

ASP.NET运行原理和运行机制

一、ASP.NET运行原理 当一个http请求发送过来并被IIS机收到之后,IIS首先通过你请求的页面类型为其加载相应的dll文件,然后在处理过程中将这条请求发送给能够处理这条请求的模块,而在ASP...
  • yiyelanxin
  • yiyelanxin
  • 2017年11月17日 08:23
  • 166

ASP.NET之旅--浅谈Asp.net运行机制(一)

很多Asp.net开发人员都有过Asp的背景,以至于我们开发程序的时候总是停留在“页面”层次思考,也就是说我们常常会只考虑我们现在所做的系统是要完成什么功能,是要做问卷调查网站还是个人网站,而很少在“...
  • zhang_xinxiu
  • zhang_xinxiu
  • 2013年09月02日 07:56
  • 11120

asp.net 请求、处理、响应原理浅析

作为一名asp.net开发人员,不了解asp.net该是一件多么可怕的事。当然,如果你对asp.net原理不了解也是可以做项目的,可你要想继续提升自己,拿高工资,实在就有点难了。 于是乎,为了追求自己...
  • ydm19891101
  • ydm19891101
  • 2016年03月07日 18:48
  • 4302

.net Framework 和asp.net的运行原理及运行机制

1..net framework简介.NET Framework是微软公司推出的完全面向对象的软件开发与运行平台,它具有两个主要组件,分别是公共语言运行库(Common Language Runtim...
  • Chenzaixia
  • Chenzaixia
  • 2010年09月06日 22:01
  • 2355

ASP.NET Core 运行原理剖析

1.1. 概述在ASP.NET Core之前,ASP.NET Framework应用程序由IIS加载。Web应用程序的入口点由InetMgr.exe创建并调用托管。以初始化过程中触发HttpAppli...
  • sD7O95O
  • sD7O95O
  • 2017年09月23日 00:00
  • 320

HTTP协议/IIS 原理及ASP.NET运行机制浅析【图解】

转自:http://www.uml.org.cn/net/201306193.asp 前言 前一段在整理邮件的时候发现几年前和CDD老师交流时的一份邮件.下面是简单摘要: “从技术角...
  • chelen_jak
  • chelen_jak
  • 2015年11月25日 18:13
  • 2536

ASP.NET 运行原理

ASP.NET运行原理
  • bydxyj
  • bydxyj
  • 2010年09月08日 16:31
  • 1034

asp.net 运行原理

此篇文章着眼于整个ASP.NET应用程序的运作模式,实际上,并不是在讲组件,但是却很重要,因为写组件的人必须清楚的知道ASP.NET应用程序是如何启动.如何处理请求,如何处理SESSION等这些细节问...
  • chenl80
  • chenl80
  • 2009年07月01日 10:28
  • 254
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:asp.net运行原理
举报原因:
原因补充:

(最多只允许输入30个字)