IIS如何处理一个Asp.net请求 (How IIS Process Asp.net request)

当一个Request由客户端发送到IIS,IIS会处理这个请求并且发送对应的资源到客户端。那么IIS是怎么处理这个Request,Asp.net在IIS 处理Request的过程中扮演一个什么角色呢? 我一直都对这个问题感兴趣,经过一个周末的努力,自己对这个问题有了一定的了解,并分享我的见解,如果有错误和不足,希望指正。。

当IIS接受到一个Request, 最先对Request进行处理的是HTTP.SYS, 它的作用是将Request分发到对应的应用程序池(Application Pool),这里会引发出两个问题:

1.什么是应用程序池?

2. HTTP.SYS是如何将Request正确分发到对应的应用程序池的?

第一个问题:提到应用程序池,就不得不提到工作者进程(Work Process)。 工作者进程(w3wp.exe)是运行Asp.net的基础,它根据Request请求的资源的拓展名(例如.aspx)将请求发送到相应的处理模块(ISAPI)。 应用程序池是工作者进程的容器,它可以包含一个或多个工作者进程而且一个应用程序池可以包含一个或多个web应用程序,而且每个应用程序池中的工作者进程都可以被池中的网站共同使用。

image_thumb[7]

第二个问题:HTTP.SYS能正确的将Request发送到相应的应用程序池,那么它是如何做到的?每当添加一个应用程序池,它所对应的ID都会被注册到HTTP.SYS,当HTTP.SYS接受到一个任何应用程序Request,它都会根据上面保存的映射关系,将Request派发到正确的应用程序池中。

在HTTP.SYS 派发Request之前的所有过程被称之为内核阶段(Kernel Model),它可以理解为IIS分配处理任务阶段。下面介绍另外一个阶段,也是我们业务逻辑实现的地方,用户阶段(User Model)。

image_thumb[9]

 

在由HTTP.SYS将Request派发到应用程序池的过程中,一个叫Web Admin Service将来自有HTTP.SYS的请求派发到应用程序池中。

在应用程序池接受到Request,工作者进程(w3wp.exe)会根据Request查找相应的处理模块,例如如果请求的是以.aspx结尾的Asp.net页面,那么w3wp会加载aspnet_isapi.dll,以这个模块对请求进行处理。 在aspnet.isapi加载之后,它会运行HttpRuntime的ProcessRequest方法,这是web应用程序的入口,当这个方法调用完毕,HttpContext,HttpRquest,HttpResponse等核心对象会被创建。

接下来HttpApplication创建,它包含一些列的HttpModule和HttpHandler,这些对象会处理相应的Request,这个过程就是我们所熟知的Http Pipeline。 程序的执行过程是由HttpModule到HttpHandler最后再到HttpModule。 我们可以自己创建HttpModule和HttpHandler,例如我们所熟悉的asp.net页面就是一个HttpHandler,想了解更多请点击这里

 

image_thumb[15]

HttpHander是IIS处理Request的终点,所有的Request都会被传送到相应的HttpHandler,这是我们熟悉的Asp.net页面的生命周期开始了。

image_thumb[20]

好了,从IIS的角度,一个Request的处理过程就已经全部介绍完了,文本的大部分知识来自于下面两篇博客,感谢博客原作者所作出的贡献。

引用:

http://www.dotnetfunda.com/articles/article821-beginners-guide-how-iis-process-aspnet-request.aspx

http://www.codeproject.com/KB/aspnet/ASPDOTNETPageLifecycle.aspx

posted on 2011-10-31 01:10  Dely  阅读(1031)  评论(0编辑  收藏  举报

导航