HTTP Pipeline

简介:

————————————————————————————————

————————————————————————————————

————————————————————————————————

———————————————————————————————

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 ,如需转载请自行联系原作者



相关文章
|
Web App开发 .NET
一起谈.NET技术,ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline[下篇]
  ASP.NET Process Model索引 ASP.NET Process Model之一:IIS 和 ASP.NET ISAPI ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline[上篇] ASP.
811 0
|
存储 Web App开发 监控
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
我们以前使用过的对hbase和hdfs进行健康检查,及剩余hdfs容量告警,简单易用 1.针对hadoop2的脚本: #/bin/bashbin=`dirname $0`bin=`cd $bin;pwd`STATE_OK=...
1023 0
|
Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
Found lingering reference异常 ERROR: Found lingering reference file hdfs://jiujiang1:9000/hbase/month_hotstatic/...
693 0
|
Web App开发 前端开发 Java
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
java链接MongoDB处理大量数据时经常碰到cursor not found 的异常,其实是超时所致 Exception in thread "main" com.
811 0
|
Web App开发 监控 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
负载均衡: LVS(Layer 4), HAProxy(Layer 4、 7),Nginx(Layer 7) 虚拟化: LXC、KVM、Xen HA:Keepalived、Heartbeat 分布式缓存...
741 0
|
Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
PipeMapRed.waitOutputThreads(): subprocess failed with code X ,这里code X对应的信息如下:error code 1: Operation not perm...
920 0
|
Web App开发 监控 前端开发
|
Web App开发 存储 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
做大做强事实表,做小做弱维表; 分布式模式-维度建模新原则  (1)以值代键:针对键值唯一的维表,除非必要,否则不引入维表,如IP地址维表,采用IP作为维表的主键,事实表中存储IP值;      (2)合理分表:传统关系型数据仓库存在多表整合的冲动,如上图Event事实表,各种Acount Ind,Finance Ind等,用来扩展表的通用性,试图把所有的数据都存储到一张表 中。
764 0