IIS7.5应用程序池iis集成模式 handler和经典模式的区别介绍

如何理解IIS 7的两种应用程序池的管道模式(Managed Pipeline Mode) - 陈希章 - 博客园
随笔 - 1325, 文章 - 0, 评论 - 3141, 引用 - 4
之前我写过一篇,讲的是.NET 4.0的应用程序部署问题。有网友问到一个相关问题就是:如何理解IIS 7中的应用程序池的管道模式,尤其是如何理解“托管模型(integrated mode)”,今天特意再写一篇文章来介绍这个问题。 & IIS 7是微软最新版本的IIS版本,从Vista开始提供,目前在Vista,Windows 7,Windows Server 2008中提供。这个全新的版本中,一个突出的亮点就是,它提供了两种管道模式,来支持不同的应用程序场景。 & 这里提到的管道模式,指的是应用程序池(Application Pool)的一个属性
上图中可以看到,这两种管道模式分别为Integrated(集成)和 Classic(经典) 那么,到底如何理解这两种模式呢? Classic模式:指的是与IIS 6或者之前版本保持兼容的一种模式,一个典型问题就是,在处理ASP.NET这种动态网站的时候,它是通过一个所谓的ISAPI程序,作为插件的方式来工作的。针对不同的动态应用程序(例如ASP,PHP等),会需要不同的ISAPI。 例如,下面就是一个注册号的ISAPI映射
从上图可以看出,不同的Request,指定了不同的ISAPI程序。下图是对于这种Pipeline的一个图形化说明
& Integrated模式:这种全新的模式,允许我们将ASP.NET更好地与IIS集成,甚至允许我们在ASP.NET中编写一些功能(例如Module)来改变IIS的行为(扩展)。集成的好处是,不再通过ISAPI的方式,提高了速度和稳定性。至于扩展,则可以使得我们对于IIS,以及其他类型的请求有更多的控制。(例如,我们希望静态网页也具备一些特殊的行为) 下图解释了这一点。
以上两个图片来自与下面这个文章,并且该文章有更详细的一些理论介绍。
& 下面,我就通过一个例子,来帮助大家更好地了解集成模型。 这个例子里面,我有一个特殊的需求就是,我希望对网站里面所有请求做一个日志监控,不管是动态网页,还是静态网页。 & 1. 创建一个Web Application
& 2. 添加一个HttpModule 为了对用户请求进行监控,我们一般会编写一个HttpModule
我为该模块实现简单的功能(将用户的请求地址打印出来在页面上)using S
using System.W
namespace WebApplication2
public class MyModule1 : IHttpModule
/// &summary&
/// You will need to configure this module in the web.config file of your
/// web and register it with IIS before being able to use it. For more information
/// see the following link: http://go.microsoft.com/?linkid=8101007
/// &/summary&
#region IHttpModule Members
public void Dispose()
//clean-up code here.
public void Init(HttpApplication context)
// Below is an example of how you can handle LogRequest event and provide
// custom logging implementation for it
context.LogRequest += new EventHandler(OnLogRequest);
#endregion
public void OnLogRequest(Object source, EventArgs e)
//custom logging logic can go here
var app = (HttpApplication)
app.Response.Write(app.Request.Url.ToString());
3.注册该模块
模块是需要注册才能够使用的。我们一般会想到以前的做法
&system.web&
&compilation debug="true" targetFramework="4.0" /&
&httpModules&
&add name="test" type="WebApplication2.MyModule1,WebApplication2"/&
&/httpModules&
&/system.web&
但这样注册,会遇到一个错误
这个错误的意思是,LogRequest这个操作,是必须运行在集成模式下的。
那么,到底如何注册成集成模式的模块呢?
我们需要将配置文件修改成下面这样&?xml version="1.0"?&
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=169433
&configuration&
&system.web&
&compilation debug="true" targetFramework="4.0" /&
&!--&httpModules&
&add name="test" type="WebApplication2.MyModule1,WebApplication2"/&
&/httpModules&--&
&/system.web&
&system.webServer&
&add name="test" type="WebApplication2.MyModule1,WebApplication2"/&
&/modules&
&/system.webServer&
&/configuration&
请注意,现在多了一个system.webServer的节,里面有一个modules的节,可以配置需要注册的一些HttpModule
因为是注册为system.webServer的Module,所以,在visual studio中调试是没有效果的
我们需要将该应用程序发布到IIS,并且设置为integrated mode。
4.发布到IIS
有很多办法进行发布,我所推荐的是用deploy package的方式。
请注意,我们使用的Application Pool是integrated mode的
发布之后,我们在浏览器中浏览首页,我们会发现在底部会有一个特殊的输出,就是我们当前请求的地址信息。这说明,我们那个Module已经在工作了。
5.测试该模块对于静态页面的支持
如果仅仅是上面这样,我们似乎看不出这种模式到底有何优势。我们以前不也是可以实现这样的效果吗?
请你主要的是,以前的HttpModule只能影响到动态网页,例如我们的ASPX网页,而对于静态网页(例如html),或者其他类型的动态网页(例如php等)是无能为力的。
那么,现在这种模式下情况是怎样的呢?
我们可以添加一个简单的html页面,放在网站根目录下
然后,我们去请求该页面
是不是很神奇呢?虽然是静态网页,但因为我们那个模块是注册在IIS里面的,它改变了IIS的行为,所以仍然会在页面底部插入一段输出。
希望上面这样的例子可以帮助大家更好地理解Integrated mode。它是允许我们将代码插入到IIS内核中,而不再通过ISAPI的方式。这将带来更好的性能和扩展性。你可能感兴趣的文章
优化思路无非就是前端优化,asp.net页面生命周期优化,数据访问优化,IIS与web.config...
如有两个域名,分别是sos.45it.com和down.45it.com,需把这两个域名都绑定到 IP是219....
简单的说,phpmyadmin就是一种mysql的管理工具,安装该工具后,即可以通过web形式直接...
对于任何一个领域的达人来说,最早都是从新手做起的,随着时间一点点的积累不断完善自...
如果php已经在系统编译好,后来又需要添加新的扩展。一种方式就是重新完全编译php,另...iis7.5 应用程序池 经典模式和集成模式的区别_百度知道
iis7.5 应用程序池 经典模式和集成模式的区别
我有更好的答案
则可以使得我们对于IIS以及其他类型的请求有更多的控制经典模式,允许我们将ASP.NET更好地与IIS集成:  这种全新的模式,在处理ASP.NET这种动态网站的时候,它是通过一个所谓的ISAPI程序,作为插件的方式来工作的。针对不同的动态应用程序(例如ASP,PHP等),会需要不同的ISAPI。集成模式:  指的是与IIS 6或者之前版本保持兼容的一种模式,一个典型问题就是,甚至允许我们在ASP.NET中编写一些功能(例如Module)来改变IIS的行为(扩展)。集成的好处是,不再通过ISAPI的方式,提高了速度和稳定性。至于扩展
为您推荐:
其他类似问题
应用程序池的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。IIS7的应用程序池详细解析
转载 & & 作者:
在 IIS 7 中,应用程序池有两种运行模式:集成模式和经典模式。应用程序池模式会影响服务器处理托管代码请求的方式
在IIS 7中,添加一个应用程序或者单独的网站,默认会自动新建一个对应的“应用程序池”,这也是IIS 7的一大特色。
在早期的IIS 5.0中,只有一个应用程序池的情况下,很容易造成“全军覆没,一荣俱损”。因为所有的网站(或者虚拟目录下的应用程序)都“寄居”在一个“池”,当这个“池”崩溃了,所有的网站都杯具了。
后来的IIS 6中,有了“应用程序池”的概念,但是默认不会自动添加,IIS 管理员可以手动去添加,配置,这样是的IIS 具有很强的隔离性。
应用程序池具有下列优点:
改进的服务器和应用程序性能。对于占用大量资源的应用程序,您可以将其分配给它们自己的应用程序池,以免影响其他应用程序的性能。
改进的应用程序可用性。如果一个应用程序池中的应用程序发生故障,将不会影响其他应用程序池中的应用程序。
改进的安全性。通过隔离应用程序,可以降低一个应用程序访问其他应用程序资源的几率。
在 IIS 7 中,应用程序池有两种运行模式:集成模式和经典模式。应用程序池模式会影响服务器处理托管代码请求的方式。如果托管应用程序在采用集成模式的应用程序池中运行,服务器将使用 IIS 和 ASP.NET 的集成请求处理管道来处理请求。但是,如果托管应用程序在采用经典模式的应用程序池中运行,服务器会继续通过 Aspnet_isapi.dll 路由托管代码请求,其处理请求的方式就像应用程序在 IIS 6.0 中运行一样。
大多数托管应用程序应该都能在采用集成模式的应用程序池中成功运行,但为实现版本兼容,有时也需要以经典模式运行。应该先对集成模式下运行的应用程序进行测试,以确定是否真的需要采用经典模式。使用IIS 7 部署asp.net mvc 应用程序时,只需要选择“集成”即可,不需要像在IIS 6中繁琐的配置(设置ISAPI映射,添加通配符...)
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具IIS 7.5中神秘的应用程序池标识解析(程序池账户)
转载 & & 投稿:mdxy-dxy
在windows2008R2新版的IIS7.5里面,我绝对除了对php更好的支持以外,最重要的一个功能应该就是“应用程序池标识”了,这是什么东西?我从网上找了篇比较不错的使用介绍,在blog里面做一份存档,以备自己需要的时候查询使用
IIS7.5中(仅win7,win2008 SP2,win2008 R2支持),应用程序池的运行帐号,除了指定为LocalService,LocalSystem,NetWorkService这三种基本类型外,还新增了一种ApplicationPoolIdentify
win7的官方帮助上是这么说的:ApplicationPoolIdentity – 默认情况下,选择“应用程序池标识”帐户。启动应用程序池时动态创建“应用程序池标识”帐户,因此,此帐户对于您的应用程序来说是最安全的。
也就是说"ApplicationPoolIdentity"帐号是系统动态创建的“虚拟”帐号(说它是虚拟的,是因为在用户管理里看不到该用户或用户组,在命令行下输入net user也无法显示,但该帐号又是确实存在的)
如何验证该帐号确实是存在的的?打开任务管理器,观察一下:
w3wp.exe即iis进程,上图中高亮部分表明该iis进程正在以帐号luckty运行(注意这里的luckty即为上图中的应用程序池名称)
好了,搞清楚这个有什么用?
先来做一个测试,比如我们在iis里新建一个站点,主目录设置为c:\2\,应用程序池就指定刚才图中的luckty
假如我们在该站点的default.aspx.cs里写入这样一行代码 :
File.AppendAllText("C:\\TestDir\\1.txt",DateTime.Now.ToString());
前提是c盘必须先建一个目录TestDir,同时除Administrator,System保留完全控制权外,其它帐号的权限都删除掉
运行后,会提示异常: 对路径“C:\TestDir\1.txt”的访问被拒绝。
原因很明显:该站点运行时是以应用程序池(luckty)对应的虚拟帐号运行的,而这个虚拟帐号不具备c:\TestDir的访问权限
这种情况在web服务器(iis6)安全配置中很常见,比如我们把图片上传目录,常常放在主目录之外,同时以虚拟目录形式挂于站点之下,另外在IIS6中不指定该目录任何执行权限 ,这样即使有人非法上传了asp/aspx木马上去,也无法运行搞不成破坏!言归正传,要想让那一行测试代码正常运行,解决办法很简单,把虚拟帐号的权限加入文件夹安全权限中即可,但是问题来了:这个虚拟帐号我们是不可见的,如果你直接添加名为luckty的用户到文件夹安全帐号里,根本通不过(提示找不到luckty用户),说明这个虚拟帐号名称并不是"luckty"
关键:手动输入 IIS AppPool\luckty (即IIS AppPool\应用程序池名),再确定,这回ok了.
当然除了用"IIS AppPool\应用程序池名"外,windows内部还有一个特殊的用户组Authenticated Users,把这个组加入TestDir的安全权限帐号里也可以,不过个人觉得没有"IIS AppPool\应用程序池名"来得精确.
结束语:IIS7.5的虚拟帐号设计确实很棒,想想传统IIS6的时候,为了把同一服务器上的各站点权限分开(以防止木马捣乱),不得不创建一堆iuser_XXX,iwam_XXX帐号并指定密码,再一个个站点分配过去,累死人!而虚拟帐号设计则让这类管理轻松多了,也不用担心密码过于简单或过期问题。So,还在等什么,赶紧升级到win7/win2008 R2吧!
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 iis express 集成模式 的文章

 

随机推荐