知识大全 ASP.NET 2.0运行时简要分析
Posted 知
篇首语:欠伸展肢体,吟咏心自愉。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 ASP.NET 2.0运行时简要分析相关的知识,希望对你有一定的参考价值。
ASP.NET 2.0运行时简要分析 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
概述: 本文基于ASP NET 的源代码 对ASP NET 运行时进行了简要的分析 希望能帮助你理解ASP NET 中请求处理过程及页面编译模型关键字 ASP NET 运行时 原理 请求处理 页面编译 ASP NET 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 的源代码边阅读 分析 当我们通过浏览器向ASP NET 网站的一个页面发起请求时 在服务器端首先是IIS收到请求 IIS一看是页面 心里很开心 因为这个请求不用它处理 交给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的主要工作是 创建HttpContext实例 对第一次请求进行初始化(EnsureFirstRequestInit) a) 在EnsureFirstRequestInit中通过调用System Web HttpRuntime FirstRequestInit进行一些初始化工作 比如 将Web Config配置读到到RuntimeConfig中 从bin目录中装载所有dll文件 创建HttpWriter实例 通过调用HttpApplicationFactory GetApplicationInstance创建HttpApplication实例 在HttpApplicationFactory GetApplicationInstance中有三个关键方法 HttpApplicationFactory _theApplicationFactory EnsureInited();HttpApplicationFactory _theApplicationFactory EnsureAppStartCalled(context);HttpApplicationFactory _theApplicationFactory GetNormalApplicationInstance(context);
下面我们对这三个方法逐个进行分析 ) 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 IsPrepiledApp) 在GetGlobalAsaxBuildResult中具体的编译是由ApplicationBuildProvider与BuildProvidersCompiler共同完成的 BuildProvidersCompiler PerformBuild();进行编译工作 ApplicationBuildProvider GetBuildResult得到编译的结果 编译成功后 会在C:\\WINDOWS\\Microsoft NET\\Framework\\v \\Temporary ASP NET Files\\相应的目录中生成类似App_global asax mlgx n v dll的dll文件 编译生成的类名为ASP global_asax 继承自HttpApplication 注 如果Web目录中没有Global asax文件 就不会编译生成App_global asax mlgx n v dll这样的文件
) _theapplicationfactory ensureappstartcalled(context); 创建特定的HttpApplication实例 触发ApplicationOnStart事件 执行ASP global_asax中的Application_Start(object sender EventArgs e)方法 这里创建的HttpApplication实例在处理完事件后 就被回收
) _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方法也是我们重点分析的方法 该方法的主要功能如下 InitModules() 根据Web Config的设置 创建相应的HttpModules HookupEventHandlersForAppplicationAndModules 根据发生的事件 调用HttpApplication实例中相应的事件处理函数 创建很多实现IExecutionStep接口的类的实例并添加到当前HttpApplication实例的_execSteps中 等待回调时执行 从这里我们可以看到HttpApplication是以异步的方式处理请求 对请求的很多处理工作都放入了_execStep等待回调时执行 _execStep中主要的处理工作如下 ) 对请求的路径进行安全检查 禁止非法路径访问(ValidatePathExecutionStep) ) 如果设置了UrlMappings 进行RewritePath(UrlMappingsExecutionStep) ) 执行事件处理函数 比如 BeginRequest AuthenticateRequest等等 ) 获取处理当前请求的HttpHandler ASP NET页面的动态编译也是在这里进行的 (MapHandlerExecutionStep)该处理是通过调用System Web HttpApplication MapHttpHandler方法 在MapHttpHandler中 首先根据访问的地址从nfig获取相应的实现IHttpHandlerFactory的类型 对于页面 默认是PageHanlderFactory 然后创建PageHanlderFactory实例 调用GetHandlerHelper 在GetHandlerHelper中调用BuildManager CreateInstanceFromVirtualPath编译并创建当前请求的ASP NET页面的实例(如果已经编译过 直接从缓存中加载) CreateInstanceFromVirtualPath经过几次方法调用 将编译任务给了BuildManager CompileWebFile() CompileWebFile从nfig得到相应的BuildProvider 对于 aspx文件 相应的BuildProvider是PageBuildProvider PageBuildProvider是如何进行页面编译的 这里就不再就进一步分析了 如果你感兴趣 可以进一步研究ASP NET 的源代码 ) 调用相应HttpHandler的 ProcessRequest方法处理请求(如果是异步方式 调用BeginProcessReques) (CallHandlerExecutionStep) ) 将响应内容写入Filter (CallFilterExecutionStep)
调用HttpApplication实例的BeginProcessRequest异步处理请求 上面所讲的_execSteps中所发生的许多事情 都是在HttpRuntime调用HttpApplication BeginProcessRequest之后 在BeginProcessRequest中调用ResumeSteps后执行的
cha138/Article/program/net/201311/12956相关参考
知识大全 如何由ASP.NET 1.1移植到ASP.NET 2.0
如何由ASP.NET1.1移植到ASP.NET2.0 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 ASP.NET入门教程 7.2 ASP.NET 2.0的数据控件
ASP.NET入门教程7.2ASP.NET2.0的数据控件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一
知识大全 ASP.NET入门教程 10.5.3 ASP.NET 2.0的新特性[2]
ASP.NET入门教程10.5.3ASP.NET2.0的新特性[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
知识大全 ASP.NET入门教程 10.5.3 ASP.NET 2.0的新特性[1]
ASP.NET入门教程10.5.3ASP.NET2.0的新特性[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
ASP.NET2.0的编译模型 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 支持两种编译模型(
知识大全 体验ASP.NET 2.0中的BuildProvider
体验ASP.NET2.0中的BuildProvider 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧
Asp.net2.0自定义控件开发 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! (一)概述
ASP.NET2.0异步页面原理浅析 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 与ASPNE
ASP.Net2.0发送邮件的代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb
使用ASP.NET2.0进行记录错误 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在本文中我们