我对asp.net运行机制的理解

时间:2024-01-07 19:03:50

有一本书叫《asp.net 本质论》,作者名叫冠军。我看了几次,都没有坚持看下来。这次连续看完了前三章,然后参考网上的资料,总结下我对.net运行机制的理解。

先上两张图:

我对asp.net运行机制的理解

我对asp.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对象中封装了常见的HttpRequestHttpResponse,以及一些状态管理。

2、HttpApplication以管道方式处理,并暴露出了众多的事件,我们可以在一些事件中处理我们的逻辑。

以下摘自《asp.net 本质论》书中,对管道处理的每个阶段描述:

序号

名称

说明

1

BeginRequest

ASP.NET开始处理的第一个事件,表示处理的开始

2

AuthenticateRequest

验证请求,一般用来取得请求的用户信息

3

PostAuthenticateRequest

已经获取请求的用户信息

4

AuthorizeRequest

授权,一般用来检查用户的请求是否获得权限

5

PostAuthorizeRequest

用户请求已经得到授权

6

ResolveRequestCache

获取以前处理缓存的处理结果,如果以前缓存过,那么不必再进行请求的处理工作,直接返回缓存结果

7

PostResolveRequestCache

已经完成缓存的存取工作(在 PostResolveRequestCache 事件之后和 PostMapRequestHandler 事件之前,会创建一个事件处理程序(一个对应于请求 URL 的页)。 如果服务器在集成模式下运行 IIS 7.0 并且 .NET Framework 至少为 3.0 版本,则会引发 MapRequestHandler 事件。 如果服务器在经典模式下运行 IIS 7.0 或者运行的是较早版本的 IIS,则无法处理此事件。)

8

PostMapRequestHandler

已经根据用户的请求,创建了处理请求的处理器对象

9

AcquireRequestState

取得请求的状态,一般用于Session

10

PostAcquireRequestState

已经取得了Session

11

PreRequestHandlerExecute

准备执行处理程序(执行事件处理程序。)

12

PostRequestHandlerExecute

已经执行了处理程序

13

ReleaseRequestState

释放请求的状态

14

PostReleaseRequestState

已经释放了请求的状态(在引发 PostReleaseRequestState 事件之后,现有的所有响应筛选器都将对输出进行筛选。)

15

UpdateRequestCache

更新缓存

16

PostUpdateRequestCache

已经更新了缓存

17

LogRequest.

请求的日志操作(仅在 IIS 7.0 处于集成模式并且 .NET Framework 至少为 3.0 版本的情况下才支持此事件。)

18

PostLogRequest

已经完成了请求的日志操作(仅在 IIS 7.0 处于集成模式并且 .NET Framework 至少为 3.0 版本的情况下才支持此事件。)

19

EndRequest

本次请求处理完成

3、初始化Module和映射Handler

系统会预先配置一些HttpModule和HttpHandler。我们自己也可以写一些Module和Handler,并注册到系统中。HttpModule特别适合一些通用的功能,统一处理,类似过滤器,HttpHandler针对某一特定请求的处理,如aspx页面请求处理。

4、Handler一般通过工厂获取,比如页面处理,通过PageHandlerFactory来获取

5、asp.net的每一个Page都是一个IHttpHandler。页面是通过模板生成的,至于页面周期呀,控件周期呀,我们现在不用关心它。