基础知识系列?各版本下IIS请求处理过程区别

转载地址→http://www.cnblogs.com/fsjohnhuang/articles/2332074.html
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
时间: 2024-10-07 05:28:09

基础知识系列?各版本下IIS请求处理过程区别的相关文章

线程基础知识系列(三)线程的同步

本文是系列的第三篇,前面2篇,主要是针对单个线程如何管理,启动等,没有过多涉及多个线程是如何协同工作的. 线程基础知识系列(二)线程的管理 :线程的状态,控制,休眠,Interrupt,yield等 线程基础知识系列(一)线程的创建和启动  :线程的创建和启动,join(),daemon线程,Callable任务. 本文的主要内容 何谓线程安全? 何谓共享可变变量? 认识synchronized关键字 认识Lock synchronized vs Lock 1.何谓线程安全 多线程是把双刃剑,带

线程基础知识系列(四)线程的同步2 线程通信和Condition变量

本文是系列的第四篇. 线程基础知识系列(三)线程的同步  :同步控制,锁及synchronized 线程基础知识系列(二)线程的管理 :线程的状态,控制,休眠,Interrupt,yield等 线程基础知识系列(一)线程的创建和启动  :线程的创建和启动,join(),daemon线程,Callable任务. 第三篇文章,重点阐述了如何使用锁和同步块对线程间共享可变变量保护,保证只有一个线程可以进入临界区.其实,没有过多的涉及另一个重要的同步概念:线程协作.第三篇中涉及的线程间并没有有效的协调.

线程基础知识系列(五)认识volatile

线程基础知识系列(四)线程的同步2  :线程的notify-wait通信机制,以及Condition条件变量 线程基础知识系列(三)线程的同步  :同步控制,锁及synchronized 线程基础知识系列(二)线程的管理 :线程的状态,控制,休眠,Interrupt,yield等 线程基础知识系列(一)线程的创建和启动  :线程的创建和启动,join(),daemon线程,Callable任务. 本篇文章主要讨论的关键字是volatile. volatile使用场景 volatile介绍 vol

线程基础知识系列(二)线程的管理

本篇是线程基础知识系列的第二篇,主要简单江夏线程管理相关知识点. 线程基础知识系列(一)线程的创建和启动:说明了线程的2种创建和启动,join(),daemon线程,Callable 任务. 本文的主要内容 线程的状态 线程的优先级 sleep vs wait 线程的流程控制 Interrupt yield让出你的CPU 1.线程的状态 以<线程基础知识系列(一)线程的创建和启动>这张图,是程序的运行时线程信息截图.有main线程,user Threads,daemon Threads.现在咱

(转)2.4.1 基础知识--添加服务引用与Web引用的区别

<Web服务开发学习实录>第2章构建ASP.NET Web服务,本章我们将学习创建Web服务的各种方法,并重点对使用Visual Studio创建ASP.NET Web服务和修改Web服务的属性进行介绍.本节为大家介绍基础知识--添加服务引用与Web引用的区别. AD: 2.4.1  基础知识--添加服务引用与Web引用的区别 由于.NET Framework 4默认不再推荐Web服务,而是通过WCF来实现Web服务的功能.而.NET Framework 3.5两者都支持,因此在添加时存在一些

【转】各版本IIS下ASP.net请求处理过程区别

原文地址:http://www.cnblogs.com/fsjohnhuang/articles/2332074.html ASP.NET是一个非常强大的构建Web应用的平台,它提供了极大的灵活性和能力以致于可以用它来构建所有类型的Web应用. 绝大多数的人只熟悉高层的框架如: WebForms 和 WebServices --这些都在ASP.NET层次结构在最高层. 这篇文章的资料收集整理自各种微软公开的文档,通过比较 IIS5.IIS6.IIS7 这三代 IIS 对请求的处理过程, 让我们熟

[C# 基础知识系列]专题一:深入解析委托——C#中为什么要引入委托

转自http://www.cnblogs.com/zhili/archive/2012/10/22/Delegate.html 引言: 对于一些刚接触C# 不久的朋友可能会对C#中一些基本特性理解的不是很深,然而这些知识也是面试时面试官经常会问到的问题,所以我觉得有必要和一些接触C#不久的朋友分享下关于C#基础知识的文章,所以有了这个系列,希望通过这个系列让朋友对C#的基础知识理解能够更进一步.然而委托又是C#基础知识中比较重要的一点,基本上后面的特性都和委托有点关系,所以这里就和大家先说说委托

基础知识系列?闲言

以前总是觉得... 写一些基础知识的博客·不就是抄书抄书嘛... 东抄西拷-- 并且发现基础知识就是这些内容嘛··· A写的和B写的都差不多·只是细节和深度不太一样··· 1 也曾问自己什么时候能写一点有深度的博客·装下X... 2 刚开始学习也是啃书...不过那时候确实没有经验吧. 3 啃书很吃力的说... 4 5 从中也知道了,人看书也要分境界的: 6 有些话·你读了不一定懂... 7 因为你根本没经历过(也说明了边读书边撸代码的重要性,需要自己去体会)··· 1 总之基础知识还是要好好慢慢

C#基础知识系列四(运算符汇总)

本文来自:http://www.cnblogs.com/aehyok/p/3504995.html 前言  本节主要来讲C#中的各种运算符.主要包括is运算符.as运算符.checked和unchecked运算符.sizeof运算符.空接合运算符(??).&和&&.移位运算符.增量和减量运算符.条件运算符(三元运算符).命名空间别名限定符. 正文  1.is运算符 is运算符可以检查对象是否与特定的类型兼容.比如下例中要检查变量是否与object类型兼容: int i=0; if(