当前位置:首页>>开发编程>>VS.NET>>新闻内容  |虚拟主机 主机托管
IIS5IIS6IIS7的ASP.net请求处理过程比较
作者: 发布时间:2008-7-31 17:47:53 | 【字体:

  ASP.NET是一个非常强大的构建Web应用的平台,它提供了极大的灵活性和能力以致于可以用它来构建所有类型的Web应用。

  绝大多数的人只熟悉高层的框架如: WebForms和 WebServices --这些都在ASP.NET层次结构在最高层。

  这篇文章的资料收集整理自各种微软公开的文档,通过比较IIS5、IIS6、IIS7这三代IIS对请求的处理过程,让我们熟悉ASP.NET的底层机制并对请求(request)是怎么从Web服务器传送到ASP.NET运行时有所了解。通过对底层机制的了解,可以让我们对ASP.net有更深的理解。

  IIS 5 的 ASP.net 请求处理过程

  对图的解释:

  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,所以这是一个托管的环境。

  ISAPI:指能够处理各种后缀名的应用程序。 ISAPI是下面单词的简写:Internet Server Application Programe Interface,互联网服务器应用程序接口。

  IIS 5 模式的特点:

  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的变量。

  IIS6 的 ASP.net 请求处理过程

  对图的解释:

  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下,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 7 的 ASP.net 请求处理过程

  IIS7站点启动并处理请求的步骤如下图:

  步骤1 到6 ,是处理应用启动,启动好后,以后就不需要再走这个步骤了。


  上图的8个步骤分别如下:

  1、当客户端浏览器开始HTTP请求一个WEB服务器的资源时,HTTP.sys拦截到这个请求。

  2、HTTP.sys contacts WAS to obtain information from the configuration store.

  3、WAS向配置存储中心请求配置信息。applicationHost.config。

  4、WWW服务接受到配置信息,配置信息指类似应用程序池配置信息,站点配置信息等等。

  5、WWW服务使用配置信息去配置HTTP.sys处理策略。

  6、WAS starts a worker process for the application pool to which the request was made.

  7、The worker process processes the request and returns a response to HTTP.sys.

  8、客户端接受到处理结果信息。

  W3WP.exe进程中又是如果处理得呢?? IIS 7 的应用程序池的托管管道模式分两种:经典和集成。这两种模式下处理策略各不相通。

  本文http://blog.joycode.com/ghj

  IIS 6 以及 IIS7 经典模式的托管管道的架构

  在IIS7之前,ASP.NET是以IIS ISAPI extension的方式外加到IIS,其实包括ASP以及PHP,也都以相同的方式配置(PHP在 IIS采用了两种配置方式,除了IIS ISAPI extension的方式,也包括了CGI的方式,系统管理者能选择PHP程序的执行方式),因此客户端对IIS的 HTTP请求会先经由IIS处理,然后IIS根据要求的内容类型,如果是HTML静态网页就由IIS自行处理,如果不是,就根据要求的内容类型,分派给各自的IIS ISAPI extension;如果要求的内容类型是ASP.NET,就分派给负责处理ASP.NET的 IIS ISAPI extension,也就是aspnet_isapi.dll。下图是这个架构的示意图。

  IIS 7 应用程序池的托管管道模式经典模式也是这样的工作原理。这种模式是兼容IIS 6 的方式,以减少升级的成本。


  IIS6的执行架构图,以及IIS7应用程序池配置成经典模式的执行架构图

  IIS 7 应用程序池的 托管管道模式 集成模式

  而IIS 7 完全整合.NET之后,架构的处理顺序有了很大的不同(如下图),最主要的原因就是ASP.NET从 IIS插件(ISAPI extension)的角色,进入了IIS核心,而且也能以ASP.NET模块负责处理IIS 7 的诸多类型要求。这些ASP.NET模块不只能处理ASP.NET网页程序,也能处理其他如ASP程序、PHP程序或静态HTML网页,也因为ASP.NET的诸多功能已经成为IIS 7 的一部份,因此ASP程序、PHP程序或静态HTML网页等类型的要求,也能使用像是Forms认证(Forms Authentication)或输出缓存(Output Cache)等ASP.NET 2.0的功能(但须修改IIS 7 的设定值)。也因为IIS 7 允许自行以ASP.NET API开发并加入模块,因此ASP.NET网页开发人员将更容易扩充IIS 7 和网站应用程序的功能,甚至能自行以.NET编写管理IIS 7 的程序(例如以程控IIS 7 以建置网站或虚拟目录)。


IIS 7 的执行架构图(集成托管信道模式下的架构)
  小结

  IIS5到 IIS6的改进,主要是HTTP.sys的改进。

  IIS6到 IIS7的改进,主要是ISAPI的改进。、

  来源:http://blog.joycode.com/ghj/archive/2008/07/25/115200.aspx


文章来源:
·ASP.NET取得当前页面的完整URL
·如何在ASP.NET程序里面执行DOS命令
·ASP.NET备份SQL Server数据库的方法
·让网站图片“另存为”“无标题.bmp”的技巧
·ASP.NET GridView的分页功能
·ASP.NET实现字母+数字方式验证码
·ASP.NET采集系统万能正则表达式
·为ASP.NET“包装”外部调用DLL
·ASP.NET与Javascript中获取URL信息
 放生
 愚爱
 够爱
 触电
 白狐
 葬爱
 光荣
 画心
 火花
 稻香
 小酒窝
 下雨天
 右手边
 安静了
 魔杰座
 你不像她
 边做边爱
 擦肩而过
 我的答铃
 怀念过去
 等一分钟
 放手去爱
 冰河时代
 你的承诺
 自由飞翔
 原谅我一次
 吻的太逼真
 左眼皮跳跳
 做你的爱人
 一定要爱你
 飞向别人的床
 爱上别人的人
 感动天感动地
 心在跳情在烧
 玫瑰花的葬礼
 有没有人告诉你
 即使知道要见面
 爱上你是一个错
 最后一次的温柔
 爱上你是我的错
 怎么会狠心伤害我
 不是因为寂寞才想
 亲爱的那不是爱情
 难道爱一个人有错
 寂寞的时候说爱我