用程序配置很清楚地就可以看到,所有 IIS 所能处理,或者叫 ISAPI 所提供代理服务的 文件类型 及其相对应的实际的后台处理程序都在这里清楚地列出来了。
我们找到 .aspx 的应用处理程序,然后点“编辑”,会出现下面的画面:图 2. 编辑.aspx 文件的处理程序一路看到这里,可以看出,所有的.aspx 文件实际上都是由 aspnet_isapi.dll 这个程序来处理的,当 IIS 把对于.aspx 页面的请求提交给了 aspnet_isapi.dll 以后,它就不再关心这个请求随后是如何处理的了。
现在我们应该知道:Asp.Net 只是服务器IIS的一个组成部分而已,它是一个 ISAPI 扩展。
这里需要注意两点: 当你修改“限制为”后,可以限制页面文件只能以某种特定方式访问 “确认文件是否存在”是实现 URL 地址映射的关键选项,我以后会专门讲述。
理解宿主环境(Hosting)从本质上讲,Asp.Net 主要是由一系列的类组成,这些类的主要目的就是将 Http 请求转变为对客户端的响应。
HttpRuntime 类是 Asp.Net 的一个主要入口,它有一个称作ProcessRequest 的方法,这个方法以一个 HttpWorkerRequest 类作为参数。
HttpRuntime 类几乎包含着关于单个 Http 请求的所有信息:所请求的文件、服务器端变量、QueryString、Http 头信息 等等。
Asp.Net 使用这些信息来加载、运行正确的文件,并且将这个请求转换到输出流中,一般来说,也就是 HTML 页面。
NOTE:二般来说,也可以是张图片。
当 Web.config 文件的内容发生改变 或者 .aspx 文件发生变动的时候,为了能够卸载运行在同一个进程中的应用程序(NOTE:卸载也是为了重新加载),Http 请求被分放在相互隔离的应用程序域中。
NOTE:可能你以前就听过应用程序域,但是不了解怎么回事,应用程序域就是AppDomain。
对于 IIS 来说,它依赖一个叫做 HTTP.SYS 的内置驱动程序来监听来自外部的 HTTP 请求。
在操作系统启动的时候,IIS 首先在 HTTP.SYS 中注册自己的虚拟路径。
NOTE:实际上相当于告诉 HTTP.SYS 哪些 URL 是可以访问的,哪些是不可以访问的。
举 个简单的例子:为什么你访问不存在的文件会出现 404 错误呢?就是在这一步确定的。
如果请求的是一个可访问的 URL,HTTP.SYS 会将这个请求交给 IIS 工作者进程。
NOTE:IIS6.0 中叫做 w3wp.exe,IIS5.0 中叫做 aspnet_wp.exe。
每个工作者进程都有一个身份标识 以及 一系列的可选性能参数。
NOTE:可选性能参数,是指诸如 回收机制的设置、超时时间设置 等等。
接下来进行的事情就是上一章节讲述的 ISAPI 了。
NOTE:这部分的内容相关性比较强,为了让大家好理解,我最后还是决定把 ISAPI 放到 前面了,可能全系列完成的时候会再调整吧。
除了映射文件与其对应的处理程序以外,ISAPI 还需要做一些其他的工作: 从 HTTP.SYS 中获取当前的 Httq 请求信息,并且将这些信息保存到 HttpWorkerRequest 类中。
在相互隔离的应用程序域 AppDomain 中加载 HttpRuntime。
调用 HttpRuntime 的 ProcessRequest 方法。
接下来才是程序员通常编写的代码所完成的工作了,然后,IIS 接收返回的数据流,并重新 返还给 HTTP.SYS,最后,HTTP.SYS 再将这些数据返回给客户端浏览器。
OK,现在你看到张子阳的空间主页了。
图 3.Asp.Net 的宿主环境 理解管道(Pipeline)在前面两章中,我们在一个相对比较低的层次上讨论了从发出 Http 请求到看到浏览器输出这转瞬即逝的十分之一秒内 IIS 和 Framework 所做的事情。
但是我们忽略了一个细节:程序员编写的代码是如何在这一过程中衔接的,本章我们就来看看这个问题。
当 Http 请求进入 Asp.Net Runtime 以后,它的管道由托管模块(NOTE:ManagedModules)和处理程序(NOTE:Handlers)组成,并且由管道来处理这个 Http 请求。
图 4. 理解 Http 管道我们按编号来看一下这幅图中的数据是如何流动的。
1. HttpRuntime 将 Http 请求转交给 HttpApplication,HttpApplication 代表着程序员创建的 Web 应用程序。
HttpApplication 创建针对此 Http 请求的 HttpContext 对象,这些对象包含了关于此请求的诸多其他对象,主要是 HttpRequest、HttpResponse、HttpSessionState 等。