IIS 5 与IIS 6 原理介绍

[ 转]

ASP.NET Process Model之一:IIS 和 ASP.NET ISAPI

前几天有一个朋友在MSN上问我“ASP.NET 从最初的接收到Http request到最终生成Response的整个流程到底是怎样的?”我觉得这个问题涉及到IISASP.NETASP.NET Runtime的处理模型的问题,并不是三言两语就能说清楚的,所以决定写这样一篇介绍IISASP.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 ResourceASP.NET ISAPI如何将Request传递给ASP.NET Runtime 环境。第二部分将着重介绍在一个托管的ASP.NET Runtime 环境对传入的Http request的处理过程。我们先来看看IIS 5.xIIS 6的处理过程。

1.             一、IIS 5.x based Process Model

IIS 5.x一个显著的特征就是Web Server和真正的ASP.NET Application的分离。作为Web ServerIIS运行在一个名为InetInfo.exe的进程上,InetInfo.exe是一个Native Executive,并不是一个托管的程序,而我们真正的ASP.NET Application则是运行在一个叫做aspnet_wpWorker Process上面,在该进程初始化的时候会加载CLR,所以这是一个托管的环境。我们接下来将谈论aspnet_wp如何创建,aspnet_wpInetInfo.exe如何进行通信,以及简单介绍在aspnet_wp中,如何将Request 导入ASP.NET Rutime Pipeline

我们通过创建虚拟目录将资源HostIIS下,原则上,我们可以通过IIS访问置于虚拟目录下的所有Resource,这部仅仅包含一些静态资源文件,比如图片、纯Html文件、CSSJS等等,也包含一些需要动态执行的文件,比如aspxasmx等等,我们还可以将RemotingWCF Service HostIIS下。对于这些静态的文件,IIS直接提取对应的文件将其作为Http Response返回给Client,但是对于这些需要进一步处理的动态执行的文件,IIS必须将Request进一步传递给对应的处理程序,待处理程序执行完毕获得最终的Http Response通过IIS返回给Client。对于IIS来说,这些处理程序通过ISAPI Extension来体现。对于基于ASP.NETResource,其对应的ISAPI ExtensionASP.NET ISAPI,通过一个aspnet_isapi.dll承载。IISMetadata database维护着一个称为ISAPI Extension Mapping的数据表,负责将不同类型的Resource影射到对应的ISAPI Extension


上图像我们展示了
IIS 5.x如何处理一个基于ASP.NET Resource(以aspx为例)的Http Request的大体流程。首先用户通过Browser请求一个aspx pageBrower向对于得Web Server,也就是目标主机的IIS。在上面我们提到过,IIS运行在一个称为InetInfo.exe的进程中,InetInfo.exe是一个Native Executive,并非一个托管的程序。IIS分析Request的目标资源文件的扩展名(这里是aspx),通过ISAPI Extension Mapping获知对应的ISPAIASP.NET ISAPI,于是加载aspnet_isapi.dll。到此为止,该Request的处理交由ASP.NET ISAPI,处理。ASP.NET ISAPI会创建一个叫做aspnet_wp.exeWorker Process(如果该进程不存在的话),在aspnet_wp.exe初始化的时候会加载CLR,从而为ASP.NET Application创建一个托管的运行环境,在CLR初始化的使用会加载两个重要的dllAppManagerAppDomainFactoryISAPIRuntime。通过AppManagerAppDomainFactoryCreate方法为Application创建一个Application Domain;通过ISAPIRuntimeProcessRequest处理Request,进而将流程拖入到ASP.NET Http Runtime Pipeline的范畴,ASP.NET Http Runtime PipelineHttp 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_wpPerformance降低到某个设定的下限,ASP.NET  ISAPI会负责结束掉该进程。当aspnet_wp结束掉之后,后续的Request会导致ASP.NET ISAPI重新创建新的aspnet_wp Worker Process

3. 最后,由于IISApplication运行在他们各自的进程中,他们之间的通信必须采用特定的通信机制。本质上IIS所在的InetInfo进程和Worker Process之间的通信是同一台机器不同进程的通信(local interprocess communications),处于Performance的考虑,他们之间采用基于Named pipe的通信机制。ASP.NET ISAPIWorker 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 ApplicationIIS来说,这两方面就显得尤为重要了。我们从IIS 5.xIIS 6 的演变,不难看出IIS 6在前一个版本基础上所作的改进也是基于这两个方面。在介绍IIS 6的处理模型之前,我们先看看IIS 5.x都什么样缺陷:

1. 首先从Performance上看,IISapplication运行在不同的进程中,虽然他们之间采用了基于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 pool对应一个Worker Processw3wp.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 ModeKernel Mode以及一些Windows底层的一些内容,推荐大家看看《Microsoft Windows InternalFour Edition Authored by Mark E.Russinovich & David A. Solomon


上图基本上演示了
IIS 6整个处理过程。在Kernel Mode下,http.sys接收到一个基于aspxhttp request,然后它会根据IIS中的Metabase查看该基于该RequestApplication属于哪个Application Pool,如果该Application Pool不存在,则创建之。否则直接将request发到对应Application PoolQueue中。我上面已经说了,每个Application Pool对应着一个Worker Processw3wp.exe,毫无疑问他是运行在User Mode下的。在IIS Metabase中维护着Application Poolworker processMappingWASWeb Administrative service)根据这样一个mapping,将存在于某个Application Pool Queuerequest 传递到对应的worker process(如果没有,就创建这样一个进程)。在worker process初始化的时候,加载ASP.NET ISAPIASP.NET ISAPI进而加载CLR。最后的流程就和IIS 5.x一样了:通过AppManagerAppDomainFactoryCreate方法为Application创建一个Application Domain;通过ISAPIRuntimeProcessRequest处理Request,进而将流程进入到ASP.NET Http Runtime Pipeline

IIS Process Model部分就介绍到这里,在下部分中,我将介绍ASP.NET Http Runtime Pipeline
Reference:

The ASP.NET HTTP Runtime

ASP.NET Internals – IIS and the Process Model

ASP.NET Internals - The bridge between ISAPI and Application Domains

Microsoft® Windows® Internals, Fourth Edition: Microsoft Windows Server™ 2003, Windows XP, and Windows 2000

转载于:https://www.cnblogs.com/jenneyblog/archive/2013/03/13/IIS5_and_IIS6_ProcessModel.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UVA340 ​​​​​​​Master-Mind Hints【数组】

Master-Mind Hints UVA - 340 题目传送门 题目大意:先输入一个整数n,表示有n个数字,下面第一行代表正确答案,其下每一行代表用户猜的答案,需统计其有多少数字位置正确(A),有多少数…

教你如何把自己从好友的QQ中删除

在QQ中,有些人看了不太顺眼,真不知当初为何让他加自己为好友的! 那有什么办法,可以把自己从对方的QQ中删除呢? 其实,用QQ就可以轻松搞定! 让我来为你支一招吧! 打开QQ&#xff0…

UVA1583 Digit Generator

Digit Generator UVA - 1583 题目传送门 题目大意&#xff1a;若x的各位数之和加上x本身等于y&#xff0c;则证明x是y的生成元&#xff0c;求输入数字n的最小生成元。 AC代码&#xff1a; #include <cstdio> #include <iostream> #include <algorithm> …

C++内存详解

伟大的Bill Gates 曾经失言&#xff1a; 640K ought to be enough for everybody — Bill Gates 1981 程序员们经常编写内存管理程序&#xff0c;往往提心吊胆。如果不想触雷&#xff0c;唯一的解决办法就是发现所有潜伏的地雷并且排除它们&#xff0c;躲是躲不了的。本文的内…

UVA1584 ​​​​​​​Circular Sequence【字符串】

Circular Sequence UVA - 1584 题目传送门 题目大意&#xff1a;输入一个环形字符串&#xff0c;需输出其最小字典序的形式的字符串。 AC代码&#xff1a; #include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #includ…

UVA1585 Score

Score UVA - 1585 题目传送门 题目大意&#xff1a;输入一个字符串&#xff0c;O的分数为1&#xff0c;若出现连续的O&#xff0c;如OOOO...&#xff0c;分数为1,2,3,4...&#xff0c;X为0分&#xff0c;求最终的分数 AC代码&#xff1a; #include <cstdio> #includ…

operater int()

class Number { int number; public: explicit Number(int n){number n;} operator int() //注意一定不能声明返回值 { return number; } }; int main () { Number n1 Number(100); int n2 n1; cout << n2 << endl; re…

UVA1586 ​​​​​​​ Molar mass

Molar mass UVA - 1586 题目传送门 题目大意&#xff1a;给你一个只包含C,H,O,N分子式&#xff0c;其中C,H,O,N的原子量分别为&#xff1a;12.01,1.008,16.00,14.01&#xff0c;求其分子量 AC代码&#xff1a; #include <cstdio> #include <iostream> #includ…

SharePoint v3:忘掉模拟用户Impersonate,SPSecurity.RunWithElevatedPrivileges来了

回顾&#xff1a; 在SharePoint V2 大家应该都用过模拟用户Impersonate这个功能&#xff0c; 这个功能用来暂时提升某个用户的权限&#xff0c;比如某个普通用户的本来不能修改某个列表的值&#xff0c;但是我们功能需要在修改。 缺点&#xff1a; 我们使用这个模拟用户功能…

UVA1225 ​​​​​​​Digit Counting

Digit Counting UVA - 1225 题目传送门 题目大意&#xff1a;输入一个数字T&#xff0c;代表有T组测试数据&#xff0c;下面每行有一个整数n&#xff0c;求将1到n的数字连成一串后每个数字出现的个数。 AC代码&#xff1a; #include <cstdio> #include <iostream&…

Chess Queen【数学】

Chess Queen UVA - 11538 题目传送门 题目大意&#xff1a;输入两个整数n,m&#xff0c;在n行m列的棋盘中放入白黑两个棋子&#xff0c;棋子在同一行、同一列或同一对角线上能相互进攻&#xff0c;问有多少种摆放方案。 AC代码&#xff1a; #include <cstdio> #incl…

Java开发中保证接口的幂等性问题

目录 1、解决方案 2、使用token保证接口幂等性的例子 3、在实际项目中&#xff0c;如何有效地使用token法来保证接口的幂等性&#xff1f; 4、3示例中如何获取请求中的 token 5、如果token验证失败&#xff0c;如何处理 6、在上述示例代码中加上token过期后重置的功能 7…

typedef 的四个用途和两大陷阱

>>>>>用途一&#xff1a;定义一种类型的别名&#xff0c;而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如&#xff1a;char* pa, pb; // 这多数不符合我们的意图&#xff0c;它只声明了一个指向字符变量的指针&#xff0c; // 和一个字符变量&am…

Triangle Counting【数学】

Triangle Counting UVA - 11401 题目传送门 题目大意&#xff1a;输入一个整数n&#xff0c;求在1到n中选取三条边能够组成多少种三角形。 AC代码&#xff1a; #include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #in…

Cheerleaders【容斥】

Cheerleaders UVA - 11806 题目传送门 题目大意&#xff1a;给你三个整数n,m,k&#xff0c;代表有一个n行m列的场地&#xff0c;共有k个人&#xff0c;需保证在最外围的一圈的每行每列都必须要有一个人&#xff0c;若这个人在对角上&#xff0c;则可以当做他所在的行列都已经…

Exploring Pyramids【动态规划——区间DP】

Exploring Pyramids UVALive - 3516 题目传送门 题目大意&#xff1a;给你一个字符串&#xff0c;其代表的是机器人来回走过的路径&#xff0c;机器人总是先走左边再走右边&#xff0c;问有多少种情况。 解决方法&#xff1a;设输入序列为S&#xff0c;d(i,j)为子序列Si,Si…

Investigating Div-Sum Property【数位DP】

Investigating Div-Sum Property UVA - 11361 题目传送门 题目大意&#xff1a;输入三个数a,b,k&#xff0c;问从a到b中有多少个数满足数字能够整除k&#xff0c;并且其数位和也能整除k。 解决方法&#xff1a;数位DP的模板题&#xff0c;Dp[x]表示在不超过x的数中满足条件…

UVA - 455 Periodic Strings【字符串】

Periodic Strings UVA - 455 题目传送门 题目大意&#xff1a;先输入一个数字n&#xff0c;在输入n行字符串&#xff0c;对每一个字符串输出其最小的周期长度&#xff0c;每两个输出间有一空行。 AC代码&#xff1a; #include <cstdio> #include <iostream> #…

螺旋方阵问题【数组】

输入n&#xff0c;输出n阶螺旋方阵&#xff0c;下面为5阶螺旋方阵&#xff1a;1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 下面为我的代码&#xff1a; #include <cstdio> #include <iostream> #include &…

马鞍点问题【数组】

如果在一矩阵中元素A[i][j]满足A[i][j]为第i行的最小值&#xff0c;第j行的最大值&#xff0c;则称这个元素为这个矩阵的马鞍点&#xff0c;求m*n矩阵所有的马鞍点。若需求一个矩阵的所有马鞍点&#xff0c;其实只需将矩阵的每行的最小值与每列的最大值分别求出存在相应的数组中…