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组件)。
(1)Part 1:前奏
(2)Part 2:核心
(3)Part 3:管道
(4)Part 4:WebForm页面生命周期
(5)Part 5:MVC页面声命周期
一、当一个请求到来时
①客户端发送一个请求给服务器端

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

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

HTTP.SYS是一个位于Windows Server和Windows XP SP2中的操作系统核心组件(内核模式中),能够让任何应用程序通过它提供的接口,以HTTP协议进行信息通讯。
关于内核模式与用户模式:
在Windows Server操作系统中,一个进程既可以运行于内核模式,也可以运行于用户模式。如果一个进程运行于内核模式,那么这个进程就可以访问所有硬件和系统数据;如果一个进 程运行于用户模式,那么这个进程不能直接访问硬件,而且访问系统数据时也会受到限制。在Intel处理器架构中一共有0~3四个特权级,内核模式运行于0级之内,而用户模式运行于3级。通过在内核模式运行Http.SYS,侦听器可以直接访问TCP/IP协议栈,但是又能够位于www服务之外,这样就不会受到应用程序中代码缺陷的影响,也不会因为应用程序崩溃而出现问题。
④如果该请求有缓存内容则直接响应

HTTP.SYS组件的一个重要的作用就在于它有一个缓存区,会将近期处理的响应结果放入这个缓存区之中,如果再次请求这个内容,则会从缓存区中取得内容并进行响应,提高了响应速度。而且, 静态的内容现在被缓存于内核模式下,这使服务响应速度更快。
二、判断是否动态资源
①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加载并调用。
三、一个神奇的入口
①所谓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的请求处理机制,今天就到此结束!
四、前奏流程总览

参考资料
(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
ASP.Net请求处理机制初步探索之旅 - Part 1 前奏的更多相关文章
- ASP.Net请求处理机制初步探索之旅 - Part 1 前奏(转)
在读本文之前建议先阅读IIS架构:http://www.cnblogs.com/tiantianle/p/5079932.html 不管是ASP.Net WebForm还是ASP.Ne ...
- ASP.Net请求处理机制初步探索之旅 - Part 2 核心
开篇:上一篇我们了解了一个请求从客户端发出到服务端接收并转到ASP.Net处理入口的过程,这篇我们开始探索ASP.Net的核心处理部分,借助强大的反编译工具,我们会看到几个熟悉又陌生的名词(类):Ht ...
- ASP.Net请求处理机制初步探索之旅 - Part 2 核心(转)
开篇:上一篇我们了解了一个请求从客户端发出到服务端接收并转到ASP.Net处理入口的过程,这篇我们开始探索ASP.Net的核心处理部分,借助强大的反编译工具,我们会看到几个熟悉又陌生的名词(类):Ht ...
- ASP.Net请求处理机制初步探索之旅 - Part 3 管道
开篇:上一篇我们了解了一个ASP.Net页面请求的核心处理入口,它经历了三个重要的入口,分别是:ISAPIRuntime.ProcessRequest().HttpRuntime.ProcessReq ...
- ASP.Net请求处理机制初步探索之旅 - Part 3 管道(转)
开篇:上一篇我们了解了一个ASP.Net页面请求的核心处理入口,它经历了三个重要的入口,分别是:ISAPIRuntime.ProcessRequest().HttpRuntime.ProcessReq ...
- 【转载】ASP.Net请求处理机制初步探索之旅 - Part 3 管道
开篇:上一篇我们了解了一个ASP.Net页面请求的核心处理入口,它经历了三个重要的入口,分别是:ISAPIRuntime.ProcessRequest().HttpRuntime.ProcessReq ...
- ASP.Net请求处理机制初步探索之旅 - Part 5 ASP.Net MVC请求处理流程
好听的歌 我一直觉得看一篇文章再听一首好听的歌,真是种享受.于是,我在这里嵌入一首好听的歌,当然你觉得不想听的话可以点击停止,歌曲 from 王菲 <梦中人>: --> 开篇:上一篇 ...
- ASP.Net请求处理机制初步探索之旅 - Part 4 WebForm页面生命周期
开篇:上一篇我们了解了所谓的请求处理管道,在众多的事件中微软开放了19个重要的事件给我们,我们可以注入一些自定义的业务逻辑实现应用的个性化设计.本篇,我们来看看WebForm模式下的页面生命周期. ( ...
- (转)Asp.Net 请求处理机制
原文:http://www.cnblogs.com/cilence/archive/2012/05/28/2520712.html Asp.Net 请求处理机制 前言 我们都知道Web请求响应是基 ...
随机推荐
- 【HTML5】 web上的音频
<!-- audio通过属性的设置可以控制音频播放的行为: 表6-2 audio元素的属性 ——————————————————————————————————————————————————— ...
- Knockout.js随手记(8)
visible, disable, css绑定 这个例子非常简单,主要演示如何通过属性控制html元素的显示与否(visible),可用性(disable)以及根据属性添加相应的CSS样式. 先简单的 ...
- CozyRSS开发记录9-快速实现一个RSS解析器
CozyRSS开发记录9-快速实现一个RSS解析器 1.再读RSS标准 既然需要自己实现一个RSS解析器,那自然需要仔细的读一读RSS的标准文档.在网上随便找了两份,一份英文一份中文: http:// ...
- 责任链模式/chain of responsibility/行为型模式
职责链模式 chain of responsibility 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 ...
- 数据分析(9):DataFrame介绍
DataFrame 表格型的数据结构 创建DataFrame 可以通过传入dict的方式,DataFrame会自动加上索引,并且列会有序排列 data = {'state':['a', 'b', 'c ...
- Android中轻松显示Gif图片
android中现在没有直接显示gif的view,只能通过mediaplay来显示,且还常常不能正常显示出来,为此写了这个gifview,其用法和imageview一样使用方法:1-把GifView. ...
- tomcat的安全配置(禁用http方法,部署多个应用,启用从安全cookie,指定错误页面和显示信息)
配置版本:tomcat6 1,虚拟路径,可以配置多个host在一个tomcat中,docbase是web应用目录,此处在server.xml中添加应用配置,要让server.xml配置生效需要重启to ...
- win下安装jdk7后,修改环境变量无法改为jdk6的问题
jdk的安装包,现在的策略改变了,不再帮你设置环境变量,而是直接把java.exe,javaw.exe,javaws.exe直接拷贝到了system32下. 删掉这3个,path就生效了!
- img及父元素(容器)实现类似css3中的background-size:contain / background-size:cover
img及父元素(容器)实现类似css3中的background-size:contain / background-size:cover <!DOCTYPE html> <html ...
- 【原】iOS学习之UITabBar的隐藏
当页面使用 UITabBarController + UINavigationController 框架的时候,当跳转到详情页面的时候,如果 UITabBar 仍然存在的话就会造成逻辑混乱,用户体验也 ...