ASP.Net请求处理机制初步探索之旅 - Part 1 前奏(转)

开篇:ASP.Net是一项动态网页开发技术,在历史发展的长河中WebForm曾一时成为了ASP.Net的代名词,而ASP.Net MVC的出现让这项技术更加唤发朝气。可是,不论是ASP.Net WebForm仍是ASP.Net MVC在请求处理机制上大部分都是相同的,只是在请求处理管道上的处理事件作了不一样的操做,所以,本文标题不区分ASP.Net WebForm和ASP.Net MVC,但在后续的介绍中会区分开来介绍。此外,本文以IIS经典模式为主,不讨论集成模式(IIS7后加入了集成模式,不用加载外部的aspnet_isapi.dll组件)。css

(1)Part 1:前奏html

(2)Part 2:核心编程

(3)Part 3:管道api

(4)Part 4:WebForm页面生命周期缓存

(5)Part 5:MVC页面声命周期服务器

1、当一个请求到来时

①客户端发送一个请求给服务器端

②一个HTTP请求对应一个HTTP报文

③HTTP.SYS组件捕获请求,对报文做最基本的处理

  HTTP.SYS是一个位于Windows Server和Windows XP SP2中的操做系统核心组件(内核模式中),可以让任何应用程序经过它提供的接口,以HTTP协议进行信息通信。架构

关于内核模式与用户模式:asp.net

在Windows Server操做系统中,一个进程既能够运行于内核模式,也能够运行于用户模式。若是一个进程运行于内核模式,那么这个进程就能够访问全部硬件和系统数据;若是一个进 程运行于用户模式,那么这个进程不能直接访问硬件,并且访问系统数据时也会受到限制。在Intel处理器架构中一共有0~3四个特权级,内核模式运行于0级以内,而用户模式运行于3级。经过在内核模式运行Http.SYS,侦听器能够直接访问TCP/IP协议栈,可是又可以位于www服务以外,这样就不会受到应用程序中代码缺陷的影响,也不会由于应用程序崩溃而出现问题。网站

④若是该请求有缓存内容则直接响应

  HTTP.SYS组件的一个重要的做用就在于它有一个缓存区,会将近期处理的响应结果放入这个缓存区之中,若是再次请求这个内容,则会从缓存区中取得内容并进行响应,提升了响应速度。并且, 静态的内容如今被缓存于内核模式下,这使服务响应速度更快spa

2、判断是否动态资源

①IIS首先判断请求的内容是不是静态资源?

  IIS首先会判断请求的是不是静态资源,若是是则直接到文件系统中拿到请求的html/css/js/jpg/gif/png等资源直接响应请求。

②若是是动态资源则先查找是由哪一个扩展来处理?

  IIS自己不会处理动态资源请求,它会根据请求的资源类型到一个被称为“处理程序映射”中去查找应该由哪一个扩展程序来处理这个请求。在IIS中,对于asp.net的请求通常是由aspnet_isapi.dll这个组件来进行.net运行时的加载和具体请求的处理。有了基于ISAPI的扩展扩展程序,IIS服务器就能够根据客户端请求的资源扩展名,来决定应由哪一个ISAPI扩展程序来处理客户端请求,而后就能够将请求转发给合适的ISAPI扩展程序。

关于IIS服务器扩展:

因为IIS服务器在设计时引入了开放的ISAPI接口标准,具有极高的可扩展性。在核心组件不变的状况下可灵活支持不一样类型不一样版本的ASP.NET应用程序。

关于ISAPI:

ISAPI(服务器应用编程接口),它为开发人员提供了强大的可编程能力,只要按照标准接口开发不一样类型的Web应用程序的ISAPI扩展程序,就能实现对IIS功能上的扩展,从而使IIS能够处理不一样类型的客户端请求。IIS管理器提供了应用程序配置功能,能够对不一样的客户端请求配置不一样的ISAPI扩展程序。ISAPI扩展程序一般以DLL形式存在,能够被IIS加载并调用。

3、一个神奇的入口

①所谓Worker Process(工做者进程)

  刚刚咱们大致上介绍了IIS的处理步骤,但其实IIS对于动态资源的处理首先会经过一个工做进程去加载具体的处理组件dll。以IIS 6.0为例,若是IIS判断它本身没法处理asp.net的请求,会由W3WP.exe所维护的工做进程来加载aspnet_isapi.dll。

②.NET运行时的加载

  若是Web应用程序是第一次加载,那么首先会由aspnet_isapi.dll加载.NET运行时(主要是调用服务器上的.Net Framework建立CLR运行时)。而一个IIS工做进程里有一个应用程序池,其中能够承载多个应用程序域AppDomain。

关于应用程序池:
应用程序池就是能够当作装载计算机分配给动态网站的内存的容器。若是内存是水,那么应用程序池就是鱼缸,动态网站就是鱼缸中的金鱼。多个动态网站能够存在于同一个应用程序池里,即鱼缸中能够放多条金鱼。固然,若是金鱼多了,鱼缸中的空间有限,金鱼之间就会争抢空间,不是很坚固的鱼缸可能就会破裂,全部金鱼都会受到影响。便是动态网站多了,内存不足,可能会形成内存级别的溢出漏洞,影响全部在那个应用程序池上的动态网站。

关于应用程序域:

使用.NET创建的可执行程序,并无直接承载到进程当中,而是承载到应用程序域(AppDomain)当中。应用程序域是.NET引入的一个新概念,它比进程所占用的资源要少,能够被看做是一个轻量级的进程。

③应用程序域的加载

  在.NET运行时建立好以后,经过应用程序域工厂AppDomainFactory建立应用程序域AppDomain。建立好AppDomain以后,就将请求转给该AppDomain中的ISAPIRuntime对象,而后调用ISAPIRuntime对象的ProcessRequest()方法来进行处理。

  ISAPIRuntme.ProcessRequest()方法是进入ASP.Net的第一个入口,ASP.Net的核心处理部分就刚刚开始。此篇我将其称为前奏,是由于它是在ASP.Net的核心处理部分以前,将HTTP请求一步一步地传递给了ISAPIRuntime对象,后面咱们再继续探索ASP.Net的请求处理机制,今天就到此结束!

4、前奏流程总览

参考资料

(1)Darren Ji,《ASP.NET MVC请求处理管道声明周期的19个关键环节》:http://www.cnblogs.com/darrenji/p/3795661.html

(2)JackyXM,《HTTP.SYS详解》:http://www.cnblogs.com/yxmx/articles/1652128.html

(3)木宛城主,《ASP.NET那点鲜为人知的事儿》:http://www.cnblogs.com/OceanEyes/archive/2012/08/13/aspnetEssential-1.html

(4)Tony He,《ASP.NET请求处理机制》:http://www.cnblogs.com/cilence/archive/2012/05/28/2520712.html

 

 

做者:周旭龙

出处:http://edisonchou.cnblogs.com/

相关文章
相关标签/搜索