Asp.Net页面执行流程分析
在我的上一篇文章中说到了HttpModule、HttpHandle的简单使用,我们可以利用它们在页面请求的过程中加入自己的事件处理程序。那么在一个aspx页面请求时后台到底做了什么?当然asp.net做了很多事情,过程也比较复杂,本文主要分析一下大体的流程。总体流程如下:
请求一个页面时首先被WWW服务截获(inetinfo.exe进程),这个进程首先判断页面的后缀,然后根据IIS中的配置来决定调用哪个扩展程序,比如aspx的页面就会调用c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,aspneface="Verdana">t_isapi.dll将请求发送给w3wp.exe进程(我们在调试IIS中网站时就是把VS2005附加到这个进程上的)。接下来w3wp.exe进程就会调用.net类库进行具体处理:ISAPIRuntime-->HttpRuntime-->HttpApplicationFactory-->HttpApplication-->HttpModule--HttpHandlerFactory-->HttpHandler 这也是本文主要分析的地方。 下面只是列出主要流程,如果喜欢钻研的同学可以用Reflector去查看一下:
以下为引用的内容: ISAPIRuntime HttpRuntime.AppDomainAppPathInternal; StringUtil.EqualsIgnoreCase(appPathTranslated, appDomainAppPathInternal)) HttpRuntime.ShutdownAppDomain(ApplicationShutdownReason.PhysicalApplica tionPathChanged, SR.GetString("Hosting_Phys_Path_Changed", new object[] { appDomainAppPathInternal, appPathTranslated })); |
它的主要作用是调用一些非托管代码生成HttpWorkerRequest对象,该对象包含当前请求的所有信息,然后传递给HttpRuntime,这里生成的HttpWorkerRequest对象可以直接在我们的页面中调用的,通过它取得原始的请求信息:
以下为引用的内容:
IServiceProvider provider = (IServiceProvider)HttpContext.Current; (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest)); |
二:HttpRuntime
最主要的就是private void ProcessRequestInternal(HttpWorkerRequest wr)方法:
以下为引用的内容: context = new HttpContext(wr, false); HttpApplicationFactory.GetApplicationInstance(context); this._handlerCompletionCallback, context); |
1、根据HttpWorkerRequest对象生成HttpContext,HttpContext应该大家都很熟悉的,它包含request、response等属性,在页面中经常会用到的;
2、调用HttpApplicationFactory来生成IHttpHandler(这里生成的是一个默认的HttpApplication对象,HttpApplication也是IHttpHandler接口的一个实现)
3、调用HttpApplication对象执行请求
三:HttpApplicationFactory
正如2.2中所提到的,这里主要是生成一个HttpApplication对象:
以下为引用的内容: internal static string GetApplicationFile() "global.asax"); |
首先会查看是否存在global.asax文件,如果有的话就用它来生成HttpApplication对象,从这里我们可以看到global.asax的文件名是在asp.net的框架中写死的,不能修改的。如果这个文件不存在就使用默认的对象。
创建好HttpApplication之后对它进行初始化:
以下为引用的内容:
application = (HttpApplication) HttpRuntime.CreateNonPublicInstance(this._theApplicationType); ApplicationImpersonationContext()) this._eventHandlerMethods); |
四、HttpApplication这个是比较复杂也比较重要的一个对象首先是执行初始化操作,比较重要的一步就是进行HttpModule的初始化:
以下为引用的内容:
private void InitModules() RuntimeConfig.GetAppConfig().HttpModules.CreateModules(); |
程序接着进行事件实际绑定:
以下为引用的内容:
if (HttpRuntime.UseIntegratedPipeline) app.CreateEventExecutionSteps(HttpApplication.EventBeginRequest, steps); steps); app.CreateEventExecutionSteps(HttpApplication.EventDefaultAuthenticatio n, steps); app.CreateEventExecutionSteps(HttpApplication.EventPostAuthenticateRequ est, steps); steps); app.CreateEventExecutionSteps(HttpApplication.EventPostAuthorizeRequest , steps); app.CreateEventExecutionSteps(HttpApplication.EventResolveRequestCache, steps); app.CreateEventExecutionSteps(HttpApplication.EventPostResolveRequestCa che, steps); app.CreateEventExecutionSteps(HttpApplication.EventPostMapRequestHandle r, steps); app.CreateEventExecutionSteps(HttpApplication.EventAcquireRequestState, steps); app.CreateEventExecutionSteps(HttpApplication.EventPostAcquireRequestSt ate, steps); app.CreateEventExecutionSteps(HttpApplication.EventPreRequestHandlerExe cute, steps); app.CreateEventExecutionSteps(HttpApplication.EventPostRequestHandlerEx ecute, steps); app.CreateEventExecutionSteps(HttpApplication.EventReleaseRequestState, steps); app.CreateEventExecutionSteps(HttpApplication.EventPostReleaseRequestSt ate, steps); steps); app.CreateEventExecutionSteps(HttpApplication.EventPostUpdateRequestCac he, steps); |
注意上面红色标注的MapHandlerExecutionStep(读取所有的HttpHandler配置)、CallHandlerExecutionStep就是对Handle程序进行处理的,也就是说在web.config中配置的HttpHandler都是在这里进行处理的,执行顺序如上所示然后就是调用2.3中的方法执行请求:
以下为引用的内容:
Code context, AsyncCallback cb, object extraData) extraData); |
在ResumeSteps中就是执行事件处理程序。
转载于:https://www.cnblogs.com/netweb/archive/2008/11/05/1326763.html
Asp.Net页面执行流程分析相关推荐
- 【永春】Asp.Net页面执行流程分析
HttpModule.HttpHandle的简单使用,我们可以利用它们在页面请求的过程中加入自己的事件处理程序.那么在一个aspx页面请求时后台到底做了什么?当然asp.net做了很多事情,过程也比较 ...
- 「Vue 学习笔记 1」Vue 项目快速搭建,初始项目各个文件夹作用介绍和启动代码执行流程分析
「Vue 学习笔记 1」Vue 项目快速搭建,初始项目各个文件夹作用介绍和启动代码执行流程分析 前言 一.我的开发环境 二.使用 Vue CLI (Vue 脚手架)快速搭建项目 三.初始项目的目录结构 ...
- DRF基本使用及执行流程分析 | APIView源码分析
DRF基本使用及执行流程分析 介绍: # 使用的都是CBV的方式 ,继承的类为drf提供的类(提供的类很多) # 这里目前继承使用APIView类 # 因为APIView是所有类的基类,其他类可能拓展 ...
- 动态执行流程分析和性能瓶颈分析的利器——gperftools的Cpu Profiler
在<动态执行流程分析和性能瓶颈分析的利器--valgrind的callgrind>中,我们领略了valgrind对流程和性能瓶颈分析的强大能力.本文将介绍拥有相似能力的gperftools ...
- 动态执行流程分析和性能瓶颈分析的利器——valgrind的callgrind
在<内存.性能问题分析的利器--valgrind>一文中我们简单介绍了下valgrind工具集,本文将使用callgrind工具进行动态执行流程分析和性能瓶颈分析.(转载请指明出于brea ...
- Java多线程- 线程池的基本使用和执行流程分析 - ThreadPoolExecutor
线程池的实现原理 池化技术 一说到线程池自然就会想到池化技术. 其实所谓池化技术,就是把一些能够复用的东西放到池中,避免重复创建.销毁的开销,从而极大提高性能. 常见池化技术的例如: 线程池 内存池 ...
- scala语言的底层是java实现的_Scala学习笔记一(与Java、Jvm的关系以及程序执行流程分析)...
一.Scala语言与Java.Jvm的关系分析 Scala语言是马丁奥德斯基接触Java语言后,针对Java语言的特点,将函数式编程语言的特点融合到Java中,由此发明的.Scala语言和Java语言 ...
- 【网络安全】Metasploit生成的Shellcode的导入函数解析以及执行流程分析(2)
密码破解的利器--彩虹表(rainbow table) 确定 shellcode 依赖于哪些导入将使研究人员进一步了解其其余逻辑.不用动态分析shellcode,并且考虑到研究人员已经弄清楚了上面的哈 ...
- Scala 执行流程分析
Scala 执行流程分析
最新文章
- Java学习笔记32
- 使用访问控制列表预防IP地址欺骗(IP Address Spoofing Prevention with ACLs)
- 我是如何学习写一个操作系统(七):进程的同步与信号量
- hbase导入csv文件_HBase 数据导入 ImportTsv
- 进程的三个状态的转换
- 1,日志组件XLog
- 需要用sq语句 修改大批量用户的密码_网站文章seo优化及修改已收录文章建议
- DevExpress 破解方式
- SaveRasterFile failed: IDLnaMetadata Error:naGetMetadata-GetMetadataJob failed
- java中mergesort函数怎么用,由mergeSort引发的一些思考
- 7K字面经 | 百度金融、蚂蚁金服、易贷网、金蛋科技等互联网金融公司面试经验...
- cpu性能天梯图包含服务器,服务器cpu性能天梯图
- 黑马培训一个月多月的心得体会
- 博士申请 | 香港城市大学计算机学院徐伟涛老师组招收人工智能全奖博士生
- NVIDIA Jetson AGX Orin的计算能力
- halcon学习之回形针方向检测(一)
- java学习视频网课收集
- 2022K班结对编程任务
- NBA中的那些黑科技
- echarts y轴数据添加单位
热门文章
- esp freertos_如何开始使用FreeRTOS和ESP8266
- 查缺补漏 | Python自定义函数
- 华为鸿蒙有机会吗,谷歌重压之下,华为鸿蒙还有机会翻盘吗?全球系统生态之争开启...
- 怎样找到适合自己的UI设计培训班
- Python入门学习方法有哪些?
- Mac下sublime text2 解决中文乱码
- 【解决】MySql 5.6 运行崩溃错误
- php查询mysql放到数组中_php查询mysql数据库并将结果保存到数组的方法
- 计算机电缆djyvp工艺,计算机电缆dJyvP相关办法.pdf
- Annotation