### ASP.NET 的运行原理与运行机制

当一个 HTTP 请求到服务器并被 IIS 接收到之后，IIS 首先通过客户端请求的页面类型为其加载相应的 dll 文件，然后在处理过程中将这条请求发送给能够处理这个请求的模块。在 ASP.NET 3.5 中，这个模块叫做 HttpHandler（HTTP 处理程序组件），之所以 aspx 这样的文件可以被服务器处理，就是因为在服务器端有默认的 HttpHandler 专门处理 aspx 文件。IIS 在将这条请求发送给能够处理这个请求的模块之前，还需要经过一些 HttpModule 的处理，这些都是系统默认的 Modules（用于获取当前应用程序的模块集合），在这个 HTTP 请求传到 HttpHandler 之前要经过不同的 HttpModuls 的处理。这样做的好处，一是为了一些必须的过程，二是为了安全性，三是为了提高效率，四是为了用户能够在更多的环节上进行控制，增强用户的控制能力。ASP.NET 3.5 运行原理如图 1 所示。

图 1 ASP.NET 3.5 运行原理

说明：HttpModule 模块是一个组件，可以注册为 ASP.NET 3.5 请求生命周期的一部分，当处理该组件时，该组件可以读取或更改请求或响应。HttpModule 模块通常用于执行需要监视每个请求的特殊任务，如安全或站点统计信息。

ASP.NET 3.5 运行机制如图 2 所示。

图 2 ASP.NET 3.5 运行机制

通常情况下，ASP.NET 框架搭建在 Windows Server（服务器版操作系统）+IIS（Web 服务器，是 Internet 信息服务管理器的英文缩写）环境中，在安装.NET FrameWork 时，安装程序将会在 IIS 中注册 ASP.NET 所需的 ISAPI 扩展（aspnet_isapi.dll），这就使得作为 ASP.NET 宿主的 IIS 在接收到客户端的 HTTP 请求后，将响应请求的控制权交给 ASP.NET 运行时。

ASP.NET 运行时接收到请求后，会判断站点是否为第一次被访问，如果是第一次访问，则运行初始化工作（如加载 Bin 目录中的 DLL 动态链接库，读取 Web.Config 网站配置文件，初始化 HttpApplication 实例，编译和加载 Global.asax 文件等等）。ASP.NET 运行时还负责创建请求响应线程的 HttpContext 上下文实例和创建承载响应结果的 HttpTextWriter 实例。然后，ASP.NET 运行时寻找合适 HttpHandler（通常就是具有的 ASP.NET 页面）处理 HTTP 请求，并等 HttpHandler 返回请求处理结果。最后，ASP.NET 运行时在完成一些后续工作之后，如保存 Session、异常处理，再通过 IIS 把响应结构返回给客户端。

注意：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)在流水线上进行生产。