http://www.sina.com.cn 2008年07月30日 16:04 《程序员》

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

转载于:https://www.cnblogs.com/xioxu/archive/2009/07/29/1534204.html

IIS5IIS6IIS7的ASP.net 请求处理过程比较(转)相关推荐

  1. IIS5、IIS6、IIS7的ASP.net 请求处理过程比较

    IIS5.IIS6.IIS7的ASP.net 请求处理过程比较  这篇文章是收集整理自各种微软公开的文档,通过比较 IIS5.IIS6.IIS7 这三代 IIS 对请求的处理过程, 让我们熟悉 ASP ...

  2. IIS5、IIS6、IIS7的ASP.net 请求处理过程比较转

    http://blog.csdn.net/dz45693/archive/2009/12/17/5027882.aspx ASP.NET是一个非常强大的构建Web应用的平台,它提供了极大的灵活性和能力 ...

  3. IIS 相关概念(站点、虚拟目录、应用程序池、隔离模式、W3WP.EXE、Web Gargen) 及 IIS 6的ASP.net请求处理过程

    基本概念: 1. 站点程序:在IIS中我们所新建的站点,可以为其配置ASP.net以及应用程序池的版本. 2. 虚拟目录:用来将不同的文件夹中的内容通过虚拟目录组织到同一个文件夹中,相当于一个应用程序 ...

  4. 【转载】各版本IIS下ASP.net请求处理过程(3)

    IIS  7 应用程序池的 托管管道模式  集成模式 而 IIS 7 完全整合 .NET 之后,架构的处理顺序有了很大的不同(如下图),最主要的原因就是 ASP.NET 从 IIS 插件(ISAPI ...

  5. ASP.Net请求处理机制初步探索之旅 - Part 3 管道

    开篇:上一篇我们了解了一个ASP.Net页面请求的核心处理入口,它经历了三个重要的入口,分别是:ISAPIRuntime.ProcessRequest().HttpRuntime.ProcessReq ...

  6. ASP.Net请求处理机制初步探索之旅 - Part 2 核心

    开篇:上一篇我们了解了一个请求从客户端发出到服务端接收并转到ASP.Net处理入口的过程,这篇我们开始探索ASP.Net的核心处理部分,借助强大的反编译工具,我们会看到几个熟悉又陌生的名词(类):Ht ...

  7. ASP.Net请求处理机制初步探索之旅 - Part 2 核心(转)

    开篇:上一篇我们了解了一个请求从客户端发出到服务端接收并转到ASP.Net处理入口的过程,这篇我们开始探索ASP.Net的核心处理部分,借助强大的反编译工具,我们会看到几个熟悉又陌生的名词(类):Ht ...

  8. asp.net架构之请求处理过程:HttpModule,HttpHandler

    一 asp.net 事件模型机制 -----------------------一 客户的请求页面由aspnet_isapi.dll这个动态连接库来处理,把请求的aspx文件发送给CLR进行编译执行, ...

  9. ASP.Net请求处理模式

    传统的服务器脚本语言,如ASP.JSP等,编写服务器脚本的方式大同小异,都是在Html中嵌入解释或编译执行的代码,由服务器平台执行这些代码来生成Html:对于这类似的脚本,页面的生存周期实际上很简单, ...

最新文章

  1. android camera工程师,浅析Android Camera架构
  2. android获取wifi连接状态,获取android设备wifi连接状态
  3. SQL Server 2008的cross apply 和 outer apply
  4. PyTorch nn.Module 一些疑问
  5. 小胖机器人能刷碗吗_小胖机器人好不好?透过真相看本质
  6. Yarn简单介绍及内存配置
  7. instagram架构_如何为亚马逊,Instagram,Zalando和天猫生成产品图像
  8. Spring解决bean之间的循环依赖(循环引用)
  9. Angular 7和 .NET Core 2.2——全球天气(第2部分)
  10. java处理excel-xlsx格式大文件的解决方案
  11. 计算机鼠标左右键作用,win7电脑鼠标右键有什么功能和作用
  12. steam错误代码 -118 ; 443/80或其他端口被占用,请关闭占用该端口的进程后再点击启动服务 ; 关闭端口进程
  13. java调用高拍仪获取图像_使用Java调用摄像头进行拍照源码
  14. 【Scratch】青少年蓝桥杯_每日一题_12.01_角色装扮
  15. 【亲测有效】快速简单解决apple Ipad无法配对apple pencil问题
  16. 细数我曾经看过的动画片(不完全统计)
  17. 中医知识分享之《养生十八伤》
  18. TxtView 手机文本阅读器
  19. 漫谈图像超分辨率技术
  20. 使用U盘启动安装U盘内linux6.1

热门文章

  1. 坐火车太无聊,我溜入微软 VS Code官方GitHub仓库,但没敢发动供应链攻击
  2. SAP SolMan 严重漏洞的自动化 exploit 代码遭公开
  3. Sophos 修复 Cyberoam OS 中的 SQL 注入漏洞
  4. Django restframework 嵌套关系处理
  5. 十(7)rsync:介绍、常用选项、通过ssh同步、通过服务同步、linux系统日志、screen...
  6. 学习node js 之微信公众帐号接口开发 准备工作
  7. 实业逻辑与品牌逻辑的矛盾
  8. 连接池-Connection pools
  9. 【指针】C++中指针的使用艺术[转]
  10. 网站压力测试工具 webbench