Ps:建议初学者在阅读本文之前,先简要了解一下之前的几篇文章,以便于熟悉本文提到的一些关于IIS6的内容,方便理解。仅供参考。

PS:为什么叫瞎说呢?我觉得自己理解的并不到位,只能是作为一个传声筒,希望能给大家一些启发,引发一些讨论,来让大家更好的理解asp.net处理原理。有错误的地方,大家一定要指正,一定不要给我面子。谢谢大家。

在之前的几篇文章中,我跟大家分享了ASP.NET应用程序生命周期的一些知识,大多是在IIS6中。
随着技术的迅猛发展,IIS7逐渐的走入我们的视线,我相信未来也将全面代替IIS6等旧的版本。今天我们就来了解一下IIS7是如何工作的,它究竟能给我们带来什么。

我们知道,IIS6使用HTTP.SYS这个协议监听器来处理HTTP和HTTPS请求,IIS7也一样。HTTP.SYS是内核模式运行的,它替换了WINDOWS Sockets API(用户模式的)来接收请求。大家一听这“内核”肯定是要比“用户”厉害的嘛,好处我就不详说了。

下面我就说说说整个处理过程,从IIS6开始。

在IIS6中,www service管理IIS中Http的配置和管理,对worker process进行管理,对网站性能进行监控,工作能力可谓强大。然而在IIS7中,微软为www service进行了减负,www service不再兼任worker process的管理员,而仅仅是作为HTTP.SYS的适配器,主要职责就是配置HTTP.SYS。Windows Process Activation Service分享了www service之前的一些职能,包括管理应用程序池的配置和worker process的管理。最大的改进在于:IIS7中asp.net管道和IIS管道被合并在了一起来处理请求(集成模式)。
这样做有什么好处呢?
在之前的IIS版本中,只有托管代码才可以使用IIS的module,先在所有的文件类型都可以使用这些module,也就是说,你可以为静态页面使用asp.net forms authentication和URL authorization;
消除了IIS和ASP.NET的重复特性。例如客户端在请求一个托管文件时,旧版本的IIS会先通过IIS管道再通过ASP.NET管道。先在,只需要通过集成管道调用IIS的验证模块就可以了;
在同一位置管理所有模块,而不是在IIS中和ASP.NET中个管理一部分,这就简化了配置和管理。

关于应用程序池,IIS7允许用户选择两种模式:经典模式和集成模式。集成模式就是我们刚刚提到的通过整个ASP.NET和IIS7变成集成管道来处理;经典模式就是IIS6中的模式分开管理。值得注意的是,IIS7在应用程序级别设置这种模式,所以我们才可以在同一server上运行两种处理模型的应用程序;而iis6在server级别设置worker process的隔离模式,所以我们只能使用一个处理模型(当然,也只有一种处理模型,那就是IIS+ASP.NET)

集成应用程序池模式
 当一个应用程序池在集成模式下时,你可以利用IIS和ASP.NET的集成请求处理架构。当一个worker process在一个应用程序池中接收到一个请求时,这个请求通过一些列的事件列表进行传递。每个事件调用需要的默认和托管的模块来处理请求的对应的部分生成response。
 集成模式有如下好处:
首先,IIS和asp.net请求处理模型被集成为一个统一的处理模型。这个模型消除了以前IIS和ASP.NET中重复的步骤,比如authentication。另外,集成模式使得托管特性的可用性扩展到所有的内容类型。

经典应用程序池模式
 经典模式时,IIS7处理请求的方式和IIS6一模一样。ASP.NET请求首先通过IIS的默认处理步骤,然后被引入ASPNET_ISAPI在托管runtime中来处理托管代码。最后,请求再被路由回IIS,发送response。
 这种IIS和ASP.NET分离的处理模型结果导致某些处理步骤重复,例如验证和授权。另外,托管代码特性,比如forms验证,也只能被asp.net应用程序使用(或者你写脚本映射所有的请求需要被ASPNET_ISAPI.DLL来处理)。
 在升级产品环境到IIS7并指定应用程序模式为集成模式前,要确保在继承模式下对现有的应用程序进行兼容性测试。如果集成模式失败,就加到经典模式上来。

说了那么多与以往版本的不同,我们以HTTP请求为例来捋顺一下IIS7的处理过程:

首先,客户端通过Internet发过来HTTP请求,HTTP.SYS接收到该请求。HTTP.SYS随后通知WAS说:去获取配置信息。WAS的配置信息来自于ApplicationHost.config。然后WWW SERVICE会得到配置信息,比如应用程序池和站点配置。我们知道,IIS7中WWW SERVICE主要功能就是配置HTTP.SYS,它配置了HTTP.SYS后,WWW SERVICE将请求通知给WAS。
WAS收到请求(可以是HTTP或非HTTP)后就会进行如下处理过程:
检查worker process是否在运行。如果一个应用程序池已经有了一个worker process,则将请求传递给WP;否则将创建一个WP。
Worker Process处理了请求后就返回一个response给HTTP.SYS。最后客户端接收response。
Worker Process里面则对该请求进行了一系列处理,可能包括验证,授权,缓存,异常等等module。
整个处理过程可以用两张图来表示,如下:

IIS处理过程:

Worker Process处理过程:
 

本文已经不再是趣谈了,虽然无“趣”,却也算有理,欢迎拍砖。

[转]ASP.NET应用程序生命周期趣谈(五) IIS7瞎说的更多相关文章

  1. [转]ASP.NET应用程序生命周期趣谈(三) HttpModule

    在之前的文章中,我们提到过P_Module(HttpModule)这个能干的程序员哥们儿,它通过在项目经理HttpApplication那里得到的授权,插手整个应用程序级别的事件处理.所有的HttpM ...

  2. [转]ASP.NET应用程序生命周期趣谈(一)

    这几天一直在看ASP.NET应用程序生命周期,真是太难了,我理解起来费了劲了,但偏偏它又是那么重要,所以我希望能给大家带来一篇容易理解又好用的文章来帮助学习ASP.NET应用程序生命周期.这篇就是了. ...

  3. [转]ASP.NET应用程序生命周期趣谈(四) HttpHandler和页面生命周期

    在之前的三篇文章中,我们还算简明扼要的学习了asp.net的整个生命周期,我们知道了一个Request进来以后先去ISAPI Filter,发现是asp.net程序后又ASPNET_ISAPI.dll ...

  4. [转]ASP.NET应用程序生命周期趣谈(二)

    在上回书开始的时候我们提到博客园的IIS看了一眼我的请求后就直接交给ASP.NET去处理了,并且要求ASP.NET处理完之后返回HTML以供展示. 那么我们不仅要问: 1,    IIS肯定是没有眼睛 ...

  5. asp.net应用程序生命周期和asp.net网页的生命周期

    一.asp.net应用程序生命周期 asp.net应用程序生命周期以浏览器向web服务器(比如IIS服务器)发送请求为起点,先后经历web服务器下的ISAPI(Internet Server Appl ...

  6. asp.net应用程序生命周期

    asp.net应用程序生命周期(流程文字描述版) 请求——>IIS——>ISAPI映射——>交给asp.net(即为IIS的扩展)——>通知Application类创建一个应用 ...

  7. ASP.NET 应用程序生命周期概述[转自MSDN]

    本文转自:http://msdn.microsoft.com/zh-cn/library/ms178473(VS.80).aspx 下表描述了 ASP.NET 应用程序生命周期的各个阶段.   阶段 ...

  8. IIS 7.0 的 ASP.NET 应用程序生命周期概述(转载)

    IIS 7.0 的 ASP.NET 应用程序生命周期概述更新:2007 年 11 月本主题介绍在 IIS 7.0 集成模式下运行以及与 IIS 7.0 或更高版本一起运行的 ASP.NET 应用程序的 ...

  9. ASP.NET 应用程序生命周期

    1.请求到达IIS服务器,IIS根据文件后缀找到对应的ISAPI(Internet Server API)扩展来处理,这个配置可在网站属性里的“根目录”选项卡中的“配置”里看到.可以看到,ashx.a ...

随机推荐

  1. Xamarin.Android多界面

    一.准备 开始学习本教程前必须先完成该教程http://www.cnblogs.com/yaozhenfa/p/xamarin_android_quickstart.html 否则将无法继续. 二.界 ...

  2. 让Mono 4在Raspberry Pi上飞

    最近公司有项目想要在树莓派上做,代替原来的工控机(我们是把工控主机当作小的主机用,一台小的工控主机最少也要600左右,而树莓派只要200多).于是,公司买了一个Raspberry Pi B+和一个Ra ...

  3. JavaScript多线程之HTML5 Web Worker

    在博主的前些文章Promise的前世今生和妙用技巧和JavaScript单线程和浏览器事件循环简述中都曾提到了HTML5 Web Worker这一个概念.在JavaScript单线程和浏览器事件循环简 ...

  4. CSharpGL(9)解析OBJ文件并用CSharpGL渲染

    CSharpGL(9)解析OBJ文件并用CSharpGL渲染 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo ...

  5. Entity Framework 6 Recipes 2nd Edition(10-2)译 -> 返回输出参数

    10-2. 返回输出参数 问题 想获取存储过程里的一个或多个输出参数的值 解决方案 假设我们有一个像Figure 10-1所示的,出租车辆与租金收入的模型 Figure 10-1.出租车辆与租金收入的 ...

  6. Failure to find xxx in xxx was cached in the local repository, resolution will not be reattempted until the update interval of nexus has elapsed or updates are forced @ xxx

    问题: 在linux服务器上使用maven编译war时报错: 16:41:35 [FATAL] Non-resolvable parent POM for ***: Failure to find * ...

  7. salesforce 零基础学习(五十六)实现getById

    本来想通过template封装DAO中的getById,结果template中无法选择$(object_name),所以此种想法打消了,直接封装成一个Helper类,方便以后项目中如果有类似需要可以使 ...

  8. .NET Core的文件系统[4]:由EmbeddedFileProvider构建的内嵌(资源)文件系统

    一个物理文件可以直接作为资源内嵌到编译生成的程序集中.借助于EmbeddedFileProvider,我们可以统一的编程方式来读取内嵌于某个程序集中的资源文件,不过在这之前我们必须知道如何将一个项目文 ...

  9. Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)

    ORACLE集群概念和原理(二) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...

  10. CSS学习笔记——包含块 containing block

    以下内容翻译自CSS 2.1官方文档.网址:https://www.w3.org/TR/CSS2/visudet.html#strut 有时,一个元素的盒子的位置和尺寸根据一个确定的矩形计算,这个确定 ...