大河

  博客园 :: 首页 :: 新随笔 :: 联系 ::  :: 管理 ::

   由于最近一段时间忙的我晕头转向,所以一直没时间继续我的WEB请求之旅,深感抱歉。

   开篇之前,我必须向大家道个歉,由于我的知识水平有限,对ASP.NET没有一个系统性的认知,所以不对的地方请朋友们不吝赐教。说真的,我特别怕由于我的认知不足而误导大家,请大家一定要带着脑袋以批判的角度来阅读拙作。砖头准备好了吗?开始。  

  上文我们主要描述了iis6.0的两个核心组件WAS和Worker Progress,而本文重点讲述一下WEB请求在工作进程中都经历了什么,下面我把描述工作进程的图示放大,如下:

   

 

    我们知道,当一个有效的WEB请求到达HTTP.SYS后,发现没有相应有效的工作进程,则HTTP.SYS会告诉WAS(svchost.exe),以为之创建并启动一个工作进程(w3wp.exe)。在启动工作进程的过程中加载ISAPI(非托管代码)以及CLR(托管代码),然后在工作进程中创建应用程序域。其实如上一系列操作只是为WEB请求准备好其运行环境。

当一个WEB请求进入已经准备好的工作进程边界(工作进程从HTTP.SYS的应用程序池对应的消息队列中取出该WEB请求),那此时首先会经过ISAPI FILTER的处理,比如修改http报头和URL等,具体功能参见上文。接下来就会将处理的WEB请求交给ISAPI EXTENSION。那么ISAPI EXTENSION会干什么呢?我们先看下图:

   

   

    我们从上图可以看出,它就是一个应用程序扩展名的映射,即文件扩展名与处理该文件的应用程序的一个映射表,接下来我们看看具有aspx扩展名的文件是由哪个应用程序集处理(dll)的,如下图:

   

    

    看到了吗?其实也就告诉我们对于aspx扩展名的文件,要交给aspnet_isapi.dll处理,其实大部分文件都映射到了aspnet_isapi.dll,也就是说大部分动态的web请求文件都交由程序集aspnet_isapi.dll来处理。对于静态文件比如jpg、js、以及css等都会直接将文件返回给客户端。注意:aspnet_isapi.dll是一个非托管的Win32动态库,里面封装了很多用于与web进行交互的函数,它的处理速度那是相当的快。另外它被加载到了工作进程中,也就是说非托管的aspnet_isapi.dll与托管的web应用都处于一个工作进程中,这显然会加快其处理速度。跨进程访问是要付出代价的,所以我们不必为此担心。那么如何才能调用aspnet_isapi.dll提供的一系列服务呢,这就引出了ISAPIRuntime,它的主要功能就是负责ISAPI扩展的非托管代码与托管代码之间的沟通与交互。您只要记住这点就行了,具体实现细节我认为没必要深究。如果您对此感兴趣可以借助reflector.exe等工具进行跟踪研判。

    我们的WEB请求走到到哪儿了,没错,它经过ISAPI顺利的进入到了ASP.NET通道接下来他会一直走啊走,经过HttpApplication、httphandles等经过处理后将其响应返回给http.sys,最终到达客户端浏览器。

 

    本来关于IIS6.0还有很多说不完的话题,比如asp.net application的生命周期,以及web page的生命周期、以及如何自定义httpmodules,如何自定义httphandles等等,网上这方面的资料已经很多了,我也不再赘述。

    其实写到此我只大概介绍了IIS6.0的三个核心组件HTTP.SYS、WAS以及Worker Progress,另外两个(Inetinfo.exe和IIS MetaBase)只是轻描淡写,如果有时间我会继续说说关于这两个核心组件的内容,另外会顺带说说SSL。

   为了给大家一个关于WEB请求之旅的整体印象,我会在下一篇做个总结。如有疏漏之处还望朋友们多多海涵。

posted on 2010-09-01 17:19 大河 阅读(1782) 评论(9) 编辑 收藏

评论

( ⊙o⊙ )哇~~~


看不懂。。。。。
 回复 引用 查看   

#2楼 2010-09-01 18:26 Artech      
第一张图有笔误:W3PW=〉W3WP
打个广告:之前也写了一个篇文章《IIS和ASP.NET管道》。
 回复 引用 查看   

#3楼 2010-09-01 18:28 bullion      
哈哈, 不够深入,博主只是略过讲解而已,望能更详细说明

支持博主
 回复 引用 查看   

#4楼[楼主] 2010-09-01 19:13 大河      
Artech
谢谢指出错误,我一直关注你的博客,^_^。

bullion
说的没错,我只是重点讲了一下HTTP.SYS,WAS和WORKER PROGRESS,至于进入ASP.NET 管道后没有进行具体描述。
我觉得进入ASP.NET管道之后网上有很多这方面的文章,也就略过了。
^_^
 回复 引用 查看   

没怎么用过不是很清楚
 回复 引用   

#6楼 2010-09-02 23:09 小金龙      
呵呵 不错 新手接触ASP.NET多多支持
 回复 引用 查看   

#7楼 2010-09-03 11:12 ToBin      
好文,顶!
 回复 引用 查看   

#8楼 2010-09-05 19:43 程之恒      
很好,顶
 回复 引用 查看   

#9楼 2010-09-05 19:43 程之恒      
二楼的很细心,呵呵
 回复 引用 查看   

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1815060 JaOYgffkNIQ=