————————————————————————————————
————————————————————————————————
————————————————————————————————
———————————————————————————————
http://msdn.microsoft.com/en-us/magazine/cc188942.aspx#S1
处理http请求使用管道模型
如下图:
http请求传到一个HttpRuntime类的实例,也就是管道的开始。HttpRuntime对象检测这个请求,然后识别出他该被发送到哪个应用程序(从管道的角度来看,一个虚拟路径就是一个应用程序。)然后他使用HttpApplicationFactory来找到或者创建一个HttpApplication对象,以此处理请求。一个HttpApplication持有一组HTTP module对象,实现了IHttpModule 接口。HttpApplication 使用HTTP handler factory 来找到或者创建一个HTTP handler对象。HTTP handler是HTTP通信的终点,它处理请求消息,产生相应的响应消息。HTTP handlers和handler factories各自实现了IHttpHandler 接口和IHttpHandlerFactory接口。
一个HttpApplication,它的module和handler在一个时间内只能用来处理一个请求。如果多个请求同时到达,并且指向同一个应用程序,那么将会使用多个HttpApplication。为了效率原因,HttpApplicationFactory和HttpHandlerFactory把HttpApplication和HTTP handler各自池化。
管道使用HttpContext对象来代表每对请求/响应,这个对象传递给HttpApplication,HttpApplication在把它传递给HTTP handler。每个Module也可以访问当前的HttpContext。HttpContext 对象暴露的属性代表了HTTP请求和响应消息,它们是HttpRequest 和HttpResponse 类的实例。HttpContext也暴露了表示安全的属性,和每个Call,每个session,每个application状态。下图表示HttpContext 最常用的属性。
Application:Per-application cross-request state
Application Instance:Application object processing request
Cache:Per-application cached state
Handler:Handler object processing request
Items:Per-request state
Request:HTTP request message
Response:HTTP response message
Server:Utility functions
Session:Per-user cross-request state
User:User information
ASP.NET HTTP管道依靠IIS接收处理请求(它也可以被集成到其他web服务器中)。当IIS收到HTTP请求后,它会检查扩展名,如果文件后缀名关联到的是可执行代码,IIS将会调用代码处理请求。映射文件后缀名和可执行代码的规则记录在IIS元数据库中,当ASP.NET安装后,它会将这个映射关系添加到IIS中,包括.aspx,.asmx映射到aspnet_isapi.dll。
当IIS收到一个HTTP请求,它会调用在aspnet_isapi.dll中的代码,Aspnet_isapi.dll使用一个命名管道将请求从IIS服务转发到ASP.NET工作进程的一个实例上,aspnet_wp.exe。在windows .net服务器上,asp.net集成了IIS6.0内核模式HTTP监听,允许请求从操作系统直接传递到工作进程,不需要通过inetinfo.exe。工作进程使用HttpRuntime类的实例来处理请求
HTTP管道总是在工作进程的一个实例中处理请求,默认的,一个时间内只有一个工作进程在处理。如果你的WEB服务器有多个cpu,你可以配置管道使用多进程。管道工作进程通过APPdomain实现隔离。你可以认为一个Appdomain是一个轻量级的进程中的进程。管道发送所有的HTTP请求,指向同一个虚拟路径到单一的AppDomain。换句话说,每个虚拟路径都被看做独立的应用程序。
ASP.NET支持基于一些规则上,循环利用工作进程,包括时间,时间花销,请求服务数,请求队列数,和物理内存消耗。全局的.NET配置文件,machine.config设置这些值的阀值。当一个aspnet_wp.exe穿过这些阀值,aspnet_isapi.dll会启动一个新的工作进程实例,开始发送请求。老的实例在完成处理请求后终结。循环利用工作进程提升了可靠性。
完整的http请求在asp.net framework中的处理流程:
HttpRequest-->inetinfo.exe->ASPNET_ISAPI.DLL-->Http Pipeline-->ASPNET_WP.EXE-->HttpRuntime-->HttpApplication Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()
如果想在中途截获一个httpRequest并做些自己的处理,就应该在HttpRuntime运行时内部来做到这一点,确切的说时在HttpModule这个容器中做到这个的。
可以简单的认为如下的流程。
本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/591471 ,如需转载请自行联系原作者