从浏览器到ASP.NET
让我们从一个典型的ASP.NET Web请求的生命周期的起点开始。用户通过在浏览器中键入一个URL,点击一个超链接,提交一个HTML表单(一个post请求),或者一个客户端程序调用基于ASP.NET的WebService(通过ASP.NET提供服务)。在服务器端,IIS5或者IIS6将会收到这个请求。ASP.NET的底层通过ISAPI扩展与IIS通信,然后,通过ASP.NET,这个请求通常被路由到一个带有.aspx扩展名的页面。但是,这个处理过程如何工作,则完全依赖于HTTP处理器(handler)的执行。这个处理器将被安装用于处理指定的扩展。在IIS中,.aspx经由“应用程序扩展”被映射到ASP.NET ISAPI的dll文件:aspnet_isapi.dll。每一个触发ASP.NET的请求,都必须经由一个已经注册的,并且指向aspnet_isapi.dll的扩展名来标识。
注意:ISAPI是自定义Web请求处理中第一个并且具有最高性能的IIS入口点。
依靠扩展名,ASP.NET把一个请求路由到一个恰当的处理器,该处理器则负责处理这个请求。举个例子,WebServices的扩展名.asmx不会把一个请求路由到磁盘上的某一个页面,而是会路由到在定义中附加了指定特性(WebMethodAttribute)的类,此特性会把它标识成一个Web Services的实现。许多其它的处理器将随着ASP.NET一起被安装。当然也可以定义你自己的处理器。在IIS里所有的HttpHandler被映射并指向ASP.NET ISAPI扩展,并且这些HttpHandler也都在web.config里配置,用于把请求路由到指定的HTTP处理器里执行。每一个处理器都是一个.NET类,用于处理指定的扩展。而这些处理器可以处理简单到只有几行代码的Hello World,也可以处理复杂到类似ASP.NET的页面以及执行WebService。就目前而言,仅仅需要理解扩展就是一种基本的映射机制,ASP.NET用它可以从ISAPI里获取一个请求,然后把请求路由到指定处理该请求的处理器中。
ISAPI连接
ISAPI是底层非托管的Win32 API。它定义的接口非常的单一并且性能卓越。用这些接口处理原始指针(raw pointer),而函数指针列表(function pointer tables)则用于回调。ISAPI提供了最低层的、高性能的接口,开发者和工具厂商可以使用这些接口深入到IIS里。由于ISAPI是非常低层的,所以不太适合使用它构建应用级的程序。ISAPI趋向于被当作桥接口使用,用于给高层次的工具提供应用服务类型的功能。例如,ASP和ASP.NET都是被当作冷聚变(cold fusion)构建于ISAPI之上。大多Perl、PHP和JSP的执行如同许多第三方解决方案一样,可以在IIS运行。ISAPI是个非常好的工具,它给高层次的应用程序提供了高性能垂直访问接口。这使得那些高层次的应用程序需要的信息可以从ISAPI提供的信息中提炼。在ASP和ASP.NET里,引擎可以提炼ISAPI接口提供的表单里的对象如:Request和Response,这些对象可以从ISAPI请求的信息中读取它们各自的内容。
作为约定,ISAPI支持ISAPI扩展(extensions)和ISAPI过滤(filters)。扩展是请求处理接口,提供了跟Web Server输入和输出相关的逻辑处理。从本质上来说,它是一个事务接口。ASP和ASP.NET都被看作ISAPI扩展的实现。ISAPI是钩子接口,它允许你查看进入IIS的每一个请求并且可以修改请求的内容(包括输入和输出)或者改变模块(如:身份验证等)的行为。顺便提一下,ASP.NET通过两个方面的内容:HTTP处理器(对应ISAPI扩展)和HTTP 模块(对应ISAPI过滤)映射到ISAPI。这些相关的内容将会在后面详细描述。
ISAPI是代码的初始点,标识ASP.NET一个请求的开始。ASP.NET映射了不同的扩展到它的ISAPI扩展,ISAPI扩展位于.NET Framework目录:
<.NET FrameworkDir>\aspnet_isapi.dll可以在IIS服务管理器里看到这些映射,如图1所示。打开Web站点的根目录的属性,选择主目录选项卡,然后查看配置|应用程序映射。