技术开发 频道

从底层了解ASP.NET构架

 
   通过这种机制,在Web Server里,请求就可以被路由到ASP.NET的处理管道里。尽管.NET需要很多扩展名,但不必手工设置它们,可以使用aspnet_regiis.exe实用工具确保所有的脚本映射都被注册。
cd <.NetFrameworkDirectory> aspnet_regiis – i
    这将会把ASP.NET运行时的个别版本,通过脚本映射注册到整个Web站点,并且安装客户端脚本库,这些脚本库将会被浏览器上的控件所使用。

    注意:它是注册了安装在上面目录里的CLR的那个版本。aspnet_regiis有一个可选项,可以使你单独配置一个虚拟目录。
每一个.NET框架的版本,都拥有各自的aspnet_regiis,对于不同版本的.NET框架,你需要运行适当版本的aspnet_regiis,注册到整个站点或者虚拟目录。从ASP.NET2.0开始,在IIS控制台里,有一个IIS ASP.NET配置页面,在这个页面可以挑选.NET的版本。

IIS5和IIS6的不同之处

   当一个请求进来的时候,IIS会检查脚本映射,然后把请求路由到aspnet_isapi.dll。接下来这个DLL文件的操作是什么呢?在IIS5和IIS6里,这个请求又是如何到达ASP.NET运行时的呢?它们两者的处理方式有没有重大变化呢?图2展示了一个大致的流程。


    图2

    站在比较高的角度,观看请求从IIS到ASP.NET运行时的流程,然后直达请求处理管道。IIS5和IIS6与ASP.NET的接口采用了不同的方式,但从请求到达ASP.NET管道后的整个过程是完全一样的。

    IIS5直接把aspnet_isapi.dll寄宿在inetinfo.exe进程里,或者它们中的一个将会与工作进程隔离,如果拥有隔离权限,那么可以把Web站点和虚拟目录隔离的级别设置为中等或者高级。当第一个ASP.NET请求进来的时候,DLL将会在另一个EXE-aspnet_wp.exe里分配一个新的进程,然后把相关信息路由到这个新分配的进程里。接着这个新的进程会依次加载和寄宿.NET运行时。每一个进入到ISAPI DLL的请求,都将通过调用命名管道路由给这个工作者进程。

    注意:IIS6与之前的Web Server不同,已经对ASP.NET进行了优化处理。IIS6中使用了应用程序池。

    值得注意的是,IIS6改变了这个处理模型,IIS不再直接寄宿像ISAPI扩展的任何外部可执行代码。代替的是,IIS总会保持一个单独的工作进程:应用程序池。所有的处理都发生在这个进程里,包括ISAPI dll的执行。对于IIS6而言,应用程序池是一个重大的改进,因为它们允许以更小的粒度控制一个指定进程的执行。你可以为每一个虚拟目录或者整个Web站点配置应用程序池,这可以很容易的把每一个应用程序隔离到各自的进程里,这样就可以把它与运行在同一台机器上其他程序完全隔离。从Web处理的角度看,如果一个进程死掉,至少它不会影响到其它的进程。

    另外,应用程序池是高度可配置的。通过设置应用程序池的执行许可,可以配置它们的执行安全环境。并且可以为指定的应用程序按照相同的粒度定制这些配置。对于ASP.NET而言,IIS6最大的改进是使用应用程序池代替了machine.config里的ProcessModel实体的大部分功能。在IIS5里,这个实体是很难管理的,因为它的设置是全局的,而且不能够在指定Web程序的web.config里覆盖这些设置。当IIS6运行的时候,ProcessModel里的大部分配置将被忽略,取而代之的是读取应用程序池的配置。注意我这里说的是大部分,另外的一些配置,像线程池的大小和IO线程数目等仍然需要通过这个节点配置,这是因为,在服务器的应用程序池里没有提供类似功能的配置。

    由于应用程序池是在外部执行的,所以这些执行可以很容易的被监控和管理。IIS6还提供了许多性能计数器,可以对重启和超时选项进行跟踪。在许多情况下,这可以帮助应用程序纠正问题。最后,IIS6的应用程序池的实现不依赖COM+,正如IIS5隔离进程一样,这提高了程序的性能和稳定性,特别是那些需要在内部使用COM对象的程序。

    IIS6应用程序池也包含了ASP.NET固有的东西,ASP.NET可以和新的底层API通信,这些API允许直接访问HTTP缓冲存储器的API,而HTTP缓冲存储器的API可以直接进入Web Server的缓冲存储器,卸载ASP.NET级别的缓存。

    在IIS6里,ISAPI扩展运行在应用程序池的工作进程里。.而NET运行时也运行在这个进程里,所以ISAPI扩展和.NET运行时的通信是发生在进程内的。这就使得比必须使用命名管道接口的IIS5具有更高的性能。尽管IIS的宿主模型不同,但是真正进入托管代码的接口是类似的,仅仅在获取被路由的请求时有一些变动。
0
相关文章