- 浏览: 152235 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
北极的。鱼:
几个常用的CSS效果:1.色块透明,文字不透明:设置色块的rg ...
网页前端的浏览器兼容 -
北极的。鱼:
数字证书的作用就是用来说明,里面的公钥是谁的。
数字签名 -
北极的。鱼:
数字证书的作用,其实就是证明,证书里包含的公钥是哪个人的。
数字签名 -
北极的。鱼:
面试题,类似冒泡排序把一个字符串的大写字母放到字符串的后面,各 ...
【转】冒泡排序 -
北极的。鱼:
另一种简单桶排序实现:
using System;
using ...
【转】桶排序(Bucket Sort)
转自:http://www.cnblogs.com/artech/archive/2007/09/09/887528.html
前几天有一个朋友在 MSN上问我“ ASP.NET 从最初的接收到 Http request到最终生成 Response的整个流程到底是怎样的?”我觉得这个问题涉及到 IIS和 ASP.NETASP.NET Runtime的处理模型的问题,并不是三言两语就能说清楚的,所以决定写这样一篇介绍 IIS和 ASP.NET Runtime Process Model的文章,谈谈我对此的一个粗浅的认识,如果有什么不对的地方,希望大家及时指正。
这篇文章大体分为两个部分,第一部分我将谈谈 IIS的两个不同的版本— IIS 5.x 和 IIS 6(虽然 IIS 7已经 Release很长时间了,而且较之前两个版本发生了非常大的变化,由于本人缺乏对 IIS 7深入的了解,所以在这里就不再介绍了,不过以后我将这方面的内容补上)的处理模型: IIS如何监听来自外界的 Http request,如何根据 ISAPI Extension Mapping将对于不同 Resource的请求分发给不同的 ISAPI Extension,基于 ASP.NET Resource的 ASP.NET ISAPI如何将 Request传递给 ASP.NET Runtime 环境。第二部分将着重介绍在一个托管的 ASP.NET Runtime 环境对传入的 Http request的处理过程。我们先来看看 IIS 5.x和 IIS 6的处理过程。
1. 一、IIS 5.x based Process Model
IIS 5.x一个显著的特征就是 Web Server和真正的 ASP.NET Application的分离。作为 Web Server的 IIS运行在一个名为 InetInfo.exe的进程上, InetInfo.exe是一个 Native Executive,并不是一个托管的程序,而我们真正的 ASP.NET Application则是运行在一个叫做 aspnet_wp的 Worker Process上面,在该进程初始化的时候会加载 CLR,所以这是一个托管的环境。我们接下来将谈论 aspnet_wp如何创建, aspnet_wp和 InetInfo.exe如何进行通信,以及简单介绍在 aspnet_wp中,如何将 Request 导入 ASP.NET Rutime Pipeline。
我们通过创建 虚拟目录将资源 Host到 IIS下,原则上,我们可以通过 IIS访问置于虚拟目录下的所有 Resource,这部仅仅包含一些静态资源文件,比如图片、纯 Html文件、 CSS、 JS等等,也包含一些需要动态执行的文件,比如 aspx, asmx等等,我们还可以将 Remoting和 WCF Service Host到 IIS下。对于这些静态的文件, IIS直接提取对应的文件将其作为 Http Response返回给 Client,但是对于这些需要进一步处理的动态执行的文件, IIS必须将 Request进一步传递给对应的处理程序,待处理程序执行完毕获得最终的 Http Response通过 IIS返回给 Client。对于 IIS来说,这些处理程序通过 ISAPI Extension来体现。对于基于 ASP.NET的 Resource,其对应的 ISAPI Extension为 ASP.NET ISAPI,通过一个 aspnet_isapi.dll承载。 IIS的 Metadata database维护着一个称为 ISAPI Extension Mapping的数据表,负责将不同类型的 Resource影射到对应的 ISAPI Extension。
上图像我们展示了 IIS 5.x如何处理一个基于 ASP.NET Resource(以 aspx为例)的 Http Request的大体流程。首先用户通过 Browser请求一个 aspx page, Brower向对于得 Web Server,也就是目标主机的 IIS。在上面我们提到过, IIS运行在一个称为 InetInfo.exe的进程中, InetInfo.exe是一个 Native Executive,并非一个托管的程序。 IIS分析 Request的目标资源文件的扩展名(这里是 aspx),通过 ISAPI Extension Mapping获知对应的 ISPAI为 ASP.NET ISAPI,于是加载 aspnet_isapi.dll。到此为止,该 Request的处理交由 ASP.NET ISAPI,处理。 ASP.NET ISAPI会创建一个叫做 aspnet_wp.exe的 Worker Process(如果该进程不存在的话),在 aspnet_wp.exe初始化的时候会加载 CLR,从而为 ASP.NET Application创建一个托管的运行环境,在 CLR初始化的使用会加载两个重要的 dll: AppManagerAppDomainFactory和 ISAPIRuntime。通过 AppManagerAppDomainFactory的 Create方法为 Application创建一个 Application Domain;通过 ISAPIRuntime的 ProcessRequest处理 Request,进而将流程拖入到 ASP.NET Http Runtime Pipeline的范畴, ASP.NET Http Runtime Pipeline对 Http Request的处理是一个相对复杂的过程,相关的介绍会放在本篇文章的下一部份。在这里我们可以把它看成是一个黑盒,它接管 Request,最终生成 Html。
这基本上就是整个处理流程,很简单。不过在这里有几点需要特别指出的。
1. 首先,同一台主机上再同一时间只能运行一个 aspnet_wp进程,每个基于虚拟目录的 ASP.NET Application对应一个 Application Domain,也就是说每个 Application都运行在同一个 Worker Process中, Application之间的隔离是基于 Application Domain的,而不是基于 Process的。
2. 其次, ASP.NET ISAPI不但负责创建 aspnet_wp Worker Process,而且负责监控该进程,如果检测到 aspnet_wp的 Performance降低到某个设定的下限, ASP.NET ISAPI会负责结束掉该进程。当 aspnet_wp结束掉之后,后续的 Request会导致 ASP.NET ISAPI重新创建新的 aspnet_wp Worker Process。
3. 最后,由于 IIS和 Application运行在他们各自的进程中,他们之间的通信必须采用特定的通信机制。本质上 IIS所在的 InetInfo进程和 Worker Process之间的通信是同一台机器不同进程的通信( local interprocess communications),处于 Performance的考虑,他们之间采用基于 Named pipe的通信机制。 ASP.NET ISAPI和 Worker Process之间的通信通过他们之间的一组 Pipe实现。同样处于 Performance的原因, ASP.NET ISAPI通过异步的方式将 Request 传到 Worker Process并获得 Response,但是 Worker Process则是通过同步的方式向 ASP.NET ISAPI获得一些基于 Server的变量。
2. 二、 IIS 6 based Process Model
Reliability 和 Performance永远不我们从事软件开发不变的主题。作为 Host 基于 Http Application的 IIS来说,这两方面就显得尤为重要了。我们从 IIS 5.x到 IIS 6 的演变,不难看出 IIS 6在前一个版本基础上所作的改进也是基于这两个方面。在介绍 IIS 6的处理模型之前,我们先看看 IIS 5.x都什么样缺陷:
1. 首先从
Performance上看,
IIS和
application运行在不同的进程中,虽然他们之间采用了基于
Named Pipe的异步通信方式,但是一个基于进程之间的通信对性能的影响确实不能从根本上解决。
2. 其次,从 Reliability来考虑,一台机器上只能运行一个 worker process,每个 Application运行在同一个进程中,虽然基于 Application Domain的隔离能提供一定的 Reliability,但是一旦真个进程崩溃,所有的 Application都受影响。所以我们有时候需要提供一个基于 Process的隔离性。
基于 Reliability的改进, IIS 6引入了 Application Pool。顾名思义, Application Pool就是一个 application的容器,在 IIS 6中,我们可以创建若干 Application Pool,在创建 Web Application的时候,我们为它指定一个既定的 application pool。在运行的时候,一个 Application对应一个 Worker Process: w3wp.exe。也就是说,和前一个版本的 IIS不同的是,对于 IIS 6来说,同一台机器上可以同时运行多个 Worker Process,每个 Worker Process中的每个 Application domain对应一个 Application。这样, Application之间不但能提供 Application Domain级别的隔离,你也可以将不同的 Application置于不同的 Application Pool中,从而基于 Process级别的隔离。对于 Host 一些重要的 Application来说,这样的方式可以提供很好的 Reliability。
在 Performance方面, IIS 5.x是通过 InetInfo.exe监听 Request并把 Request分发到 Work Process。换句话说,在 IIS 5.x中对 Request的监听和分发是在 User Mode中进行,在 IIS 6中,这种工作被移植到 kernel Mode中进行,所有的这一切都是通过一个新的组件: http.sys来负责。
注: 为了避免用户应用程序访问或者修改关键的操作系统数据, windows提供了两种处理器访问模式:用户模式( User Mode)和内核模式( Kernel Mode)。一般地,用户程序运行在 User mode下,而操作系统代码运行在 Kernel Mode下。 Kernel Mode的代码允许访问所有系统内存和所有 CPU指令。关于 User Mode和 Kernel Mode以及一些 Windows底层的一些内容,推荐大家看看《 Microsoft Windows Internal》 Four Edition, Authored by Mark E.Russinovich & David A. Solomon。
上图基本上演示了 IIS 6整个处理过程。在 User Mode下, http.sys接收到一个基于 aspx的 http request,然后它会根据 IIS中的 Metabase查看该基于该 Request的 Application属于哪个 Application Pool,如果该 Application Pool不存在,则创建之。否则直接将 request发到对应 Application Pool的 Queue中。我上面已经说了,每个 Application Pool对应着一个 Worker Process: w3wp.exe,毫无疑问他是运行在 User Mode下的。在 IIS Metabase中维护着 Application Pool和 worker process的 Mapping。 WAS( Web Administrative service)根据这样一个 mapping,将存在于某个 Application Pool Queue的 request 传递到对应的 worker process(如果没有,就创建这样一个进程 )。在 worker process初始化的时候,加载 ASP.NET ISAPI, ASP.NET ISAPI进而加载 CLR。最后的流程就和 IIS 5.x一样了:通过 AppManagerAppDomainFactory的 Create方法为 Application创建一个 Application Domain;通过 ISAPIRuntime的 ProcessRequest处理 Request,进而将流程进入到 ASP.NET Http Runtime Pipeline。
对
IIS Process Model部分就介绍到这里,在下部分中,我将介绍
ASP.NET Http Runtime
Pipeline。
评论
IIS处理一个请求主要分3个阶段:1.分发本次请求给对应的ISAPI,2.加载宿主环境,3.在宿主环境中经历整个管道模型。
一下是具体的介绍每个阶段:
1. IIS接收到一个请求以后,要决定怎么去处理这个请求:a.如果这个请求只是一些静态文件,那么就直接提取资源返回给客户端。b.如果这个请求是动态文件(根据本次请求的后缀名来判断),那么IIS就没能力处理了,就把控制权交给ISAPI,ISAPI是一个接口,功能也就是一个代理(这里我估计源码应该是接口应用指向一个实现改接口的类。仅仅是我的猜测,没看过源码。),ISAPI会根据内部的Metadata database去判断传递给哪个具体的ISAPI的拓展。这里以asp.net应该程序为例,那么就把控制权交给asp.net ISAPI去处理,这里的处理程序是aspnet_isapi.dll。
2.对于IIS 5.xASP.NET ISAPI会创建一个叫做aspnet_wp.exe的Worker Process(如果该进程不存在的话),在aspnet_wp.exe初始化的时候会加载CLR,从而为ASP.NET Application创建一个托管的运行环境,在CLR初始化的使用会加载两个重要的dll:AppManagerAppDomainFactory和ISAPIRuntime。通过AppManagerAppDomainFactory的Create方法为Application创建一个Application Domain;通过ISAPIRuntime的ProcessRequest处理Request,进而将流程拖入到ASP.NET Http Runtime Pipeline的范畴。Tips:同一台主机上再同一时间只能运行一个aspnet_wp进程,每个基于虚拟目录的ASP.NET Application对应一个Application Domain,也就是说每个Application都运行在同一个Worker Process中,Application之间的隔离是基于Application Domain的,而不是基于Process的。对于IIS 6,从Reliability 和Performance方面做了很大的改进。IIS 6引入了Application Pool。顾名思义,Application Pool就是一个application的容器,在IIS 6中,我们可以创建若干Application Pool,在创建Web Application的时候,我们为它指定一个既定的application pool。在运行的时候,一个Application对应一个Worker Process:w3wp.exe。也就是说,和前一个版本的IIS不同的是,对于IIS 6来说,同一台机器上可以同时运行多个Worker Process,每个Worker Process中的每个Application domain对应一个Application。这样,Application之间不但能提供Application Domain级别的隔离,你也可以将不同的Application置于不同的Application Pool中,从而基于Process级别的隔离。对于Host 一些重要的Application来说,这样的方式可以提供很好的Reliability。另外,在IIS 5.x中,对Request的监听和分发是在User Mode中进行。在IIS6中,工作被移植到kernel Mode中进行,所有的这一切都是通过一个新的组件:http.sys来负责。在User Mode下,http.sys接收到一个基于aspx的http request,然后它会根据IIS中的Metabase查看该基于该Request的Application属于哪个Application Pool,如果该Application Pool不存在,则创建之。否则直接将request发到对应Application Pool的Queue中。每个Application Pool对应着一个Worker Process:w3wp.exe,毫无疑问他是运行在User Mode下的。在IIS Metabase中维护着Application Pool和worker process的Mapping。WAS(Web Administrative service)根据这样一个mapping,将存在于某个Application Pool Queue的request 传递到对应的worker process(如果没有,就创建这样一个进程)。在worker process初始化的时候,加载ASP.NET ISAPI,ASP.NET ISAPI进而加载CLR。最后的流程就和IIS 5.x一样了:通过AppManagerAppDomainFactory的Create方法为Application创建一个Application Domain;通过ISAPIRuntime的ProcessRequest处理Request,进而将流程进入到ASP.NET Http Runtime Pipeline。
3.进入管道模型后,就是依次进入HttpModule和httpHandler,然后在通过HttpModuler。最后把生产的相应结果给IIS,IIS再给客户端。
发表评论
-
【转】对IIS7经典模式和集成模式的理解
2015-03-31 16:01 1339转自: http://www.cnblogs.com/Law ... -
【转】细说 ASP.NET控制HTTP缓存
2015-03-27 16:42 497转自: http://www.cnblogs.com/fis ... -
【转】Forms身份验证
2015-03-25 22:33 931转自:http://www.cnblogs.com/win ... -
【转】session的存储方式和配置
2015-03-25 17:13 658转自:http://www.cnblogs.com/zha ... -
Net托管世界的应用程序域和线程
2014-05-17 01:41 1202转载:http://www.360doc.com/conte ... -
应用程序域(Application Domain)
2014-05-17 01:16 2321转载:http://www.360doc.com/cont ... -
后台用C#发起HttpWeb请求
2014-09-17 22:03 720public static string HttpPost ... -
一个asp.net页面加载问题
2011-09-16 09:20 1270我记得Page_Load中的代码在每次提交页面或刷新页面的时 ... -
【转】AspNet2.0页面生命周期
2011-08-25 20:26 989转自:http://blog.csdn.net/SysBug/ ... -
asp.net 操作XML
2011-08-15 16:33 1098最近的一个项目中要操作XML文件。 一下为本人的一点笔记,提 ... -
避免页面重复提交
2011-08-13 21:31 1038最近考虑了一个问题:假设当前一个用户在留言本提交留言。要求:提 ... -
【转】C#调用WebService
2011-07-22 16:54 997转自:http://www.cnblogs.c ... -
【转】盗链问题
2011-07-08 11:18 1049盗链 的危害我就不说了,网上有很多。 直接分析盗链原理 ... -
【转】HttpModule的认识
2011-07-07 16:36 1482转自:http://www.cnblogs.com/tangs ... -
【转】ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline
2011-07-07 14:45 1427转自:http://www.cnblogs.com/artec ... -
【转】详解IIS处理asp.net请求过程
2011-07-06 16:26 1487转自:http://www.hndxc.net/show.a ... -
asp.net中加入视频播放器
2011-03-14 17:03 10591.avi格式 <object id=&qu ... -
【转】ASP.NET中的cookie读写方法
2011-03-09 10:24 887Cookie (HttpCookie的实例)提供了一种在 We ... -
关于获得Repeater中某行数据项的某列值
2010-12-27 17:10 3166如何获得Repeater中某行数据项的某列值。高手飘过~~~ ... -
【转】GridView生成的HTML代码
2010-12-19 23:59 655<asp:GridView ID="G ...
相关推荐
我觉得这个问题涉及到IIS和ASP.NETASP.NET Runtime的处理模型的问题,并不是三言两语就能说清楚的,所以决定写这样一篇介绍IIS和ASP.NET Runtime Process Model的文章,谈谈我对此的一个粗浅的认识,如果有什么不对...
主要介绍Asp.net的工作原理,以及IIS5.0和6.0的区别. ASP.NET ISAPI 扩展 (aspnet_isapi.dll) 在 IIS 进程地址空间 (inetinfo.exe) 中运行,并通过命名管道将 ASP.NET 文件类型请求转发给 ASP.NET 辅助进程。 可以...
讲座内容: 在本节中,我们将带领大家去深入了解ASP.NET架构,包括一个HTTP请求的生命周期、HttpModule是如何工作的等。 <br/>课程讲师: 邵志东 MSDN特邀讲师 北京新科海学校 副总经理 <br/>技术...
Web服务器接收到请求时,会对所请求文件的文件扩展名进行检查,确定应该由哪一个ISAPI扩展(Asp.Net是Web服务器下的一个ISAPI扩展)来处理请求,并传递给它(这里指Asp.Net)。Asp.Net处理已映射到其上的文件扩展名(....
最近在做一个MVC 3的项目,在部署服务器时破费了一番...3. 设置IIS的“ISAPI和CGI限制”中的“ASP.NET v4.0.0.30319”为允许 4. 在IIS中发布网站; 5. 编辑该网站的应用程序池,设置.NET Framework 版本为4.0.30196;
ASP.NET底层机制,深入介绍ASP.NET处理请求的整个过程,详解HttpHandler,HttpModel,ISAPI等内容,好书,推荐推荐
在ASP.NET中,可以创建ASP.NET网站和ASP.NET应用程序,但是ASP.NET网站和ASP.NET应用程序开发过程和编译过程是有区别的。ASP.NET应用程序主要有以下特点: q 可以将ASP.NET应用程序拆分成多个项目以方便开发,管理和...
这篇文章以非常底层的视角讲述了Web请求(request)在ASP.NET框架中是如何流转的,从Web服务器,通过ISAPI直到请求处理器(handler)和你的代码.看看在幕后都发生了些什么,不要再把ASP.NET看成一个黑盒了.
但是这些文章只介绍如何来创建、删除一个虚拟目录,却没有介绍如何修改一个虚拟目录的Asp.Net版本.如果机子上装有两个版本以.Net FrameWork,在创建时将使用IIS中默认使用的版本,而默认的版本又不是你需要的,那怎么办...
本讲将通过实例比较ASP.NET下的三种典型URL重写方案——ISAPI重写(使用开源组件IIRF),ASP.NET2.0内置的urlMappings和基于自定义HTTPModule的URL重写(使用NBear.Web中的UrlRewriteModule实现),并探讨URL重写中...
素材描述:ASP+SQL SERVER同城多城市分类信息系统功能强大,本程序属于商业源代码,所有代码原装正版,保证100%开源,无任何文件加密。 运行环境:Window Server 2003 IIS6.0+ .net2.0 以上环境(ASP.NET+SQL SERVER...
解决办法:打开IIS(即Internet信息管理器),在已安装的网站名称上边点击右键,选择属性,切换到Asp.net选项卡,察看ASP.Net version(即Asp.net版本)的选项是否为空,如果为空请从下拉列表选择2.0.50727版本或更高...
ASP.net页面的扩展名为aspx ASP.NET模块(一个名为aspnet_isapi.dll的文件) 处理扩展名为aspx、ascx、asmx的文件 c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll
Rick Strahl文章的翻译,讲了关于ASP.NET的底层的工作机制,内容包括:ISAPI连接;IIS5和IIS6的不同;HttpRuntime,HttpContext以及HttpApplication; Web程序的主要部分—HttpApplication;ASP.NET管道;HttpContext...
UrlRewriter.NET是一个开源的、轻量级、高配置的URL重写组件,支持ASP.NET 1.1 和ASP.NET 2.0。UrlRewriter.NET提供地址重写的功能,它类似于Apache服务器中使用.htaccecc进行地址重写。而且使用本组件,您无需安装...
isapi扩展实例,vc6,xp系统运行通过,iis5中通过在地址栏中输入该扩展dll的地址访问,iis6中通过iis管理加入到iis通配符应用程序映射中
4.IIS5和IIS6的不同之处 5.进入.NET运行时 6.加载.NET—稍微有点神秘 7.回到运行时 8.HttpRuntime,HttpContext以及HttpApplication 9.Web程序的主要部分:HttpApplication 10.穿过ASP.NET管道 11....
转过头来我们看看如今的ASP.NET Framework是如何处理一个http request.当你请求一个*.ASPx文件的时候,同样的这个http request会被iNETinfo.exe进程截获,她判断文件的后缀之后,将这个请求转交给ASPNET_ISAPI.dll,...