IIS6.0 基本原理
Http请求刚刚到达服务器的时候
当服务器接收到一个Http请求的时候,IIS首先需要决定如何去处理这个请求(Note: 服务器处理一个.htm页面和一个.aspx页面肯定是不一样的么)。那IIS依据什么去处理?-----根据文件的后缀名。
服务器获取所请求的页面(Note: 也可以是文件,比如jimmy.jpg)的后缀名以后,接下来会在服务器端寻找可以处理这类后缀名的应用程序,如果IIS找不到可以处理此类文件的应用程序,并且这个文件也没有受到服务器端的保护(Note:一个受保护的例子就是App_Code中的文件,一个不受保护的例子就是你的js脚本),那么IIS将直接把这个文件返还给客户端。
能够处理各种后缀名的应用程序,通常被称为ISAPI应用程序(NOTE: Internet Server Application Programe Interface,互联网服务器应用程序接口)。虽然这ISAPI听上去挺气派,也算是"应用程序"。但仔细看看它的全称就明白了:他实际上只是一个接口,起到一个代理的作用,它的主要工作是映射所请求的页面(文件)和与此后缀名相对应的实际的处理程序。
看一下ISAPI,看看它到底是什么样子,步骤如下:
1. 打开IIS
2.选择随意一个站点,鼠标右键,"属性"。
3.选择"主目录"选项卡。
4.选择"配置"
你应该会看到如下的画面:
图1.应用程序配置
很清楚地就可以看到,所有IIS所能处理,或者叫ISAPI所提供代理服务的文件类型及其相对应的实际的后台处理程序都在这里清楚地列出来了。
我们找到.aspx 的应用处理程序,然后点"编辑" ,会出现下面的画面:
图2.编辑.aspx文件的处理程序
一路看到这里,可以看出,所有的.aspx文件实际上都是由aspnet_isapi.dll这个程序来处理的,当IIS把对应.aspx页面的请求提交给了aspnet_isapi.dll以后,它就不再关心这个请求随后是如何处理的了.现在我们应该知道:Asp.Net只是服务器(IIS)的一个组成部分而已,它是一个ISAPI扩展。
这里需要注意两点:
1.当你修改 "限制为" 后,可以限制页面(文件)只能以某种特定方式访问
2."确认文件是否存在" 是实现URL 地址映射的关键选项,我以后会专门讲述。
理解宿主环境(Hosting)
从本质上讲,Asp.Net 主要是由一系列的类组成,这些类的主要目的就是将Http请求转变为客户端的响应。HttpRuntime类是Asp.Net的一个主要入口,它有一个称作ProcessRequest的方法,这个方法以一个HttpWorkerRequest类作为参数。HttpRuntime类几乎包含着关于单个Http请求的所有信息:所有请求的文件,服务器端变量,QueryString ,Http头信息 等等。Asp.Net 使用这些信息来加载,运行正确的文件,并且将这个请求转换到输出流中,一般来说,也就是HTML页面。
(NOTE:卸载也是为了重新加载),Http请求被分放在相互隔离的应用程序域中。
对于IIS来说,它依赖一个叫做 HTTP.SYS 的内置驱动程序来监听来自外部的HTTP请求。在操作系统启动的时候,IIS首先在HTTP.SYS中注册自己的虚拟路径。
如果请求的是一个可访问的URL,HTTP.SYS会将这个请求交给IIS工作者进程。
每个工作者进程都有一个身份标识以及一系列的可选性能参数。
接下来进行的事情就是上面讲述的ISAPI了。
除了映射文件与其对应的处理程序以外,ISAPI还需要做一些其他的工作:
1.从HTTP.SYS中获取当前的Http请求信息,并且将这些信息保存到 HttpWorkerRequest 类中。
2.在相互隔离的应用程序域AppDomain中加载HttpRuntime。
3.调用 HttpRuntime的ProcessRequest方法。
接下来才是程序员通常编写的代码所完成的工作了 , 然后 , IIS接收返回的数据流,并重新返还给HTTP.SYS,最后,HTTP.SYS再将这些数据返回给客户端浏览器。
图3. Asp.Net的宿主环境
理解管道
在前面两章中,我们在一个相对比较低的层次上讨论了从发出Http请求到看到浏览器输出这转瞬即逝的十分之一秒内IIS和 Framework所做的事情。但是我们忽略了一个细节:程序员编写的代码是如何在这一过程中衔接的。
当Http请求进入 Asp.Net Runtime以后,它的管道由托管模块(NOTE:Managed Modules)和处理程序(NOTE:Handlers)组成,并且由管道来处理这个Http请求。
图4.理解Http管道
我们按编号来看一下这幅图中的数据是如何流动的。
1. HttpRuntime将Http请求转交给 HttpApplication,HttpApplication代表着程序员创建的Web应用程序。HttpApplication创建针对此Http请求的 HttpContext 对象,这些对象包含了关于此请求的诸多其他对象,主要是HttpRequest、HttpResponse、 HttpSessionState等。这些对象在程序中可以通过Page类或者Context类进行访问。
2.接下来Http请求通过一系列Module, 这些Module对Http请求具有完全的控制权。这些Module可以做一些执行某个实际工作前的事情。
3.Http请求经过所有的Module之后,它会被HttpHandler处理。在这一步,执行实际的一些操作,通常也就是.aspx页面所完成的业务逻辑。.aspx页面继承Page类,Page类实现了IHttpHandler接口,HttpHandler也是Http请求处理的最底层。
4.HttpHandler处理完以后,Http请求再一次回到Module,此时Module可以做一些某个工作已经完成了之后的事情。
如果我们将注意力只集中在Http请求、HttpHandler和HttpModule上,不去考虑HttpContext和HttpApplication,
那么图4.可以简化成下面这样: