小议ASP.NET页面剖析
阅读本文需要一下注意事项:
本文需要一定ASP.NET基础(尽管我是个菜鸟)
文中可能存在错误,读者自己需要辨别是非(我把自己人为正确都写上,人非圣贤,孰能无过。)
文中众多信息,来自网络,本人会尽力把所谓引用的博客一一指出(本人注重版权,尽管现在用得软件几乎全是D版)
上面都是一些废话,活跃气氛!刚买了一本园子里出的道不远人,第一篇就是讲ASP.NET模型,写的很简单。也很清晰,不过要给谭老师指出的一点是:您最好给我们介绍一下基于IIS 6.0模型,书中的好像是5.0模型。由于很简单,感觉太过瘾。
看了微软黑皮书—ASP.NET 2.0技术内幕,也有大篇幅的介绍ASP.NET 2.0的模型。但是,读起来很是晦涩难懂(可能本人太差了)
于是,今天就把园子里,以及CSDN,博客堂等等牛人的文章一并拿出来,力争自己能够通过这个博客能弄明白,大家也能看懂一二
归入正题,先上图,有了图大家就懂了五分。
这个是IIS 6.0处理ASP.NET 页面大概模型,有很多细节被忽略了。
(1)浏览器通过http协议发出一个请求到服务器端
(2)服务器端IIS接收请求,交给Http.sys处理。Http.sys是内核级进程,内核级的设备驱动http.sys将其传递到正确的应用程序池队列中,每个队列属于特定的应用程序池,也就是说属于特定的工作进程,接下来工作进程从队列中接收请求。至于详细的Http.sys的详细信息,下面一一道来。
(3) WAS是用户模式,把从应用程序池队列传递给正确的工作进程,至于什么是WAS,以及怎么工作的,下面再细说。
(4)工作进程负责加载ASP.NET ISAPI扩展,它依次加载CLR,将所有的工作委托给HTTP运行时。ISAPI是怎么回事儿,下面再说。
实质就是发过了一个Request应用程序的工作进程,WAS根据这个进程在元数据库中寻找相对应的应用程序池(根据键值Key-Value映射)如果找到了已经存在的,就把这个进程发送到这个应用程序池中,如果没有找到相对应的程序池,就创建相对应程序池。这就是WAS的功能。
有些朋友不理解一会应用程序,一会是工作进程,实质工作进程是应用程序在CPU表现,不同应用程序就是通过操作系统在CPU上创建不同进程,来实现运行的。所以进程在此可以理解为应用程序。
Http.sys
说起Http.sys 必须提起早期的IIS 4.0和5.0,在Win 2K和NT 4.0中,用户模式和内核模式之间的转换是一项开销很大的操作,服务器首先从内核模式的TCP/IP栈将传入的HTTP请求传递给用户模式的Winsock,由Winsock将请求传递给IIS。从内核模式到用户模式的切换很快发生,但不可避免地给处理过程带来瞬间的延迟。当负载较大时,这种延迟不断累加,同时由于这种转换是必不可少的,所以管理员根本没有办法优化处理过程。
Http.sys是在内模式情况下直接对http请求进行监听。 总之如上总结一句话,就是先前需要做两次办成的事儿,现在一次就办成了,而且办成效率更高。至于内部机理,可能一大篇论文也写不完。所以就把它当作黑箱,或者说OO中的封装。权且知道接口就行了,也就是知道它的作用就可以了。下面的WAS,ASP.NET ISAPI也是这样处理的。
Http.sys的作用就是监听客户浏览器端发来的请求,并发送到并相应应用程序池队列。
WAS用户模式
在用户模式(User Mode)下,http.sys接收到一个基于aspx(我们讨论的是ASP.NET)的http 请求(request),然后WAS会根据IIS中的元数据库(Metabase)查看该基于该请求(Request)的应用程序(更确切说是应用程序的工作进程)属于哪个应用程序池,如果该应用程序池(Application Pool)不存在,则创建之。如果存在,直接将请求(request)发到相对应请用程序池(Application Pool)的队列(Queue)中。 WAS就是初始化http.sys,如上所言。WAS读取元数据库(Metabase) 而元数据库实质是XML的key-value键值对。至于XML具体细节实现,按照黑箱处理。其功能就是:Metabase存放应用程序池(Application Pool)与工作进程(worker process)的key-value键值映射 )。