[转]ASP.NET应用程序生命周期趣谈(五) IIS7瞎说
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瞎说的更多相关文章
- [转]ASP.NET应用程序生命周期趣谈(三) HttpModule
在之前的文章中,我们提到过P_Module(HttpModule)这个能干的程序员哥们儿,它通过在项目经理HttpApplication那里得到的授权,插手整个应用程序级别的事件处理.所有的HttpM ...
- [转]ASP.NET应用程序生命周期趣谈(一)
这几天一直在看ASP.NET应用程序生命周期,真是太难了,我理解起来费了劲了,但偏偏它又是那么重要,所以我希望能给大家带来一篇容易理解又好用的文章来帮助学习ASP.NET应用程序生命周期.这篇就是了. ...
- [转]ASP.NET应用程序生命周期趣谈(四) HttpHandler和页面生命周期
在之前的三篇文章中,我们还算简明扼要的学习了asp.net的整个生命周期,我们知道了一个Request进来以后先去ISAPI Filter,发现是asp.net程序后又ASPNET_ISAPI.dll ...
- [转]ASP.NET应用程序生命周期趣谈(二)
在上回书开始的时候我们提到博客园的IIS看了一眼我的请求后就直接交给ASP.NET去处理了,并且要求ASP.NET处理完之后返回HTML以供展示. 那么我们不仅要问: 1, IIS肯定是没有眼睛 ...
- asp.net应用程序生命周期和asp.net网页的生命周期
一.asp.net应用程序生命周期 asp.net应用程序生命周期以浏览器向web服务器(比如IIS服务器)发送请求为起点,先后经历web服务器下的ISAPI(Internet Server Appl ...
- asp.net应用程序生命周期
asp.net应用程序生命周期(流程文字描述版) 请求——>IIS——>ISAPI映射——>交给asp.net(即为IIS的扩展)——>通知Application类创建一个应用 ...
- ASP.NET 应用程序生命周期概述[转自MSDN]
本文转自:http://msdn.microsoft.com/zh-cn/library/ms178473(VS.80).aspx 下表描述了 ASP.NET 应用程序生命周期的各个阶段. 阶段 ...
- IIS 7.0 的 ASP.NET 应用程序生命周期概述(转载)
IIS 7.0 的 ASP.NET 应用程序生命周期概述更新:2007 年 11 月本主题介绍在 IIS 7.0 集成模式下运行以及与 IIS 7.0 或更高版本一起运行的 ASP.NET 应用程序的 ...
- ASP.NET 应用程序生命周期
1.请求到达IIS服务器,IIS根据文件后缀找到对应的ISAPI(Internet Server API)扩展来处理,这个配置可在网站属性里的“根目录”选项卡中的“配置”里看到.可以看到,ashx.a ...
随机推荐
- Web前端需要熟悉大学里【高大上】的计算机专业课吗?
作为一名刚刚大学毕业,进入新的学习阶段的研究生,我必须说大学的专业课非常重要!不管你信不信,事实就是如此! 一.大学学习的专业课非常重要,它决定了我们能走到什么高度 前端的发展非常快,我常常觉得刚刚关 ...
- 从淘宝 UWP 的新功能 -- 比较页面来谈谈 UWP 的窗口多开功能
前言 之前在 剁手党也有春天 -- 淘宝 UWP ”比较“功能诞生记 这篇随笔中介绍了一下 UWP 淘宝的“比较”新功能呱呱坠地的过程.在鲜活的文字背后,其实都是程序员不眠不休的血泪史(有血有泪有史) ...
- Sublime Text3使用总结
写在前面的话:平时做项目中在用eclipse和vs,但是对于一些小项目,感觉没有必要搞那么大的一个工具使用,比如写个小微商城,搞个小脚本了什么,所以就一直在用Sublime Text,界面清新简洁,没 ...
- wx.onMenuShareTimeline使用注意事项
我在开发测试过程中,发现使用wx.onMenuShareTimeline无效果,没有显示我定义的图片.title和链接,经过调试发现原因如下: 1.图片大小要大于300pix才能显示 2.这个方法必须 ...
- 使用xUnit,EF,Effort和ABP进行单元测试(C#)
返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 本篇目录 介绍 创建测试项目 准备测试基类 创建第一个测试 测试异常 在测试中使用仓储 测试异步方法 小结 介绍 在这篇博客中,我 ...
- 易懂 易上手的cookie 最简单明了 js中cookie的使用方法及教程
今天项目中需要用到cookie 看到我的cookie不行了 大喊一声我曹 怎么可以这样 我就疯狂的在网上找 找啊 找 但是我感觉都太官方了 废话不说 看栗子 1.引入jQuery与jQuery.C ...
- MVC5 网站开发之七 用户功能 2 用户添加和浏览
目录 MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 MVC5 网站开发之三 数据存储层功能实现 MVC5 网站开发之四 业务逻辑层的架构和基本功能 MVC5 网站开发之五 展示层架 ...
- 别语言之争了,最牛逼的语言不是.NET,也不是JAVA!
谁都不用说,博客园明显的偏.NET,C#的讨论一出现,推荐讨论热火朝天,而发点JAVA的东西,应者寥寥.一旦有出现两大派系的竞争,那绝对是头条.每天都看,早就麻木了. 研二的我浸淫.NET已经三四年, ...
- EntityFramework 7 Migrations 迁移命令
示例代码: using Microsoft.Data.Entity; using System.Collections.Generic; namespace ClassLibrary1 { publi ...
- 数据库日常维护-CheckList_02有关数据库备份检查
数据库备份是DB日常运维中最基本的也是最重要的工作,很多情况下都是做成作业形式实现自动化周期性的做全备.差异以及日志备份.那么,如果作业出现问题没有完成工作,我们可以设置自动报警如email被动提醒我 ...