有一本书叫《asp.net 本质论》,作者名叫冠军。我看了几次,都没有坚持看下来。这次连续看完了前三章,然后参考网上的资料,总结下我对.net运行机制的理解。
先上两张图:
看着这两张图,回顾以前的asp.net的开发经历,很少接触这些东西。现在才知道,一个http请求从发出到响应,asp.net已经帮我们做了大量的工作。而这些幕后工作,正是封装了http请求处理的过程。
我们用的最多的是: Session存个用户信息、Request对象接个参数,Response对象Write,再就是大量的控件,比如Repeat、datalist等等。至于背后的原理,很少关注。
接下来,我们看看从用户请求发出到响应的过程:
1、请求到达监听(IIS Http.sys)
2、找到对应的应用程序池,创建w3wp进程。
3、加载ISAPI
4、加载CLR(IIS7预加载,不需要借助ISAPI)
5、AppManagerAppDomainFactory创建IsAPIRuntime,最终调用ProcessRequest方法,在此方法里,进入HttpRuntime,这是asp.net开始处理的入口。
asp.net 处理流程:
1、HttpRuntime创建HttpContext以及HttpApplication,这是两个及其重要的对象。HttpContext对象中封装了常见的HttpRequest和HttpResponse,以及一些状态管理。
2、HttpApplication以管道方式处理,并暴露出了众多的事件,我们可以在一些事件中处理我们的逻辑。
以下摘自《asp.net 本质论》书中,对管道处理的每个阶段描述:
序号 |
名称 |
说明 |
1 |
ASP.NET开始处理的第一个事件,表示处理的开始 |
|
2 |
验证请求,一般用来取得请求的用户信息 |
|
3 |
已经获取请求的用户信息 |
|
4 |
授权,一般用来检查用户的请求是否获得权限 |
|
5 |
用户请求已经得到授权 |
|
6 |
获取以前处理缓存的处理结果,如果以前缓存过,那么不必再进行请求的处理工作,直接返回缓存结果 |
|
7 |
已经完成缓存的存取工作(在 PostResolveRequestCache 事件之后和 PostMapRequestHandler 事件之前,会创建一个事件处理程序(一个对应于请求 URL 的页)。 如果服务器在集成模式下运行 IIS 7.0 并且 .NET Framework 至少为 3.0 版本,则会引发 MapRequestHandler 事件。 如果服务器在经典模式下运行 IIS 7.0 或者运行的是较早版本的 IIS,则无法处理此事件。) |
|
8 |
已经根据用户的请求,创建了处理请求的处理器对象 |
|
9 |
取得请求的状态,一般用于Session |
|
10 |
已经取得了Session |
|
11 |
准备执行处理程序(执行事件处理程序。) |
|
12 |
已经执行了处理程序 |
|
13 |
释放请求的状态 |
|
14 |
已经释放了请求的状态(在引发 PostReleaseRequestState 事件之后,现有的所有响应筛选器都将对输出进行筛选。) |
|
15 |
更新缓存 |
|
16 |
已经更新了缓存 |
|
17 |
请求的日志操作(仅在 IIS 7.0 处于集成模式并且 .NET Framework 至少为 3.0 版本的情况下才支持此事件。) |
|
18 |
已经完成了请求的日志操作(仅在 IIS 7.0 处于集成模式并且 .NET Framework 至少为 3.0 版本的情况下才支持此事件。) |
|
19 |
本次请求处理完成 |
3、初始化Module和映射Handler
系统会预先配置一些HttpModule和HttpHandler。我们自己也可以写一些Module和Handler,并注册到系统中。HttpModule特别适合一些通用的功能,统一处理,类似过滤器,HttpHandler针对某一特定请求的处理,如aspx页面请求处理。
4、Handler一般通过工厂获取,比如页面处理,通过PageHandlerFactory来获取
5、asp.net的每一个Page都是一个IHttpHandler。页面是通过模板生成的,至于页面周期呀,控件周期呀,我们现在不用关心它。