[集成与经典] IIS 7.0 集成模式和经典模式 的区别
前言:
IIS 7 中 程序池的运行模式有两种:集成模式和经典模式(向下兼容),应用程序池的模式会影响服务器处理托管代码请求方式。
如果托管应用程序采用集成模式的应用程序池中运行,那么服务器将采用IIS和ASP.NET集成的 System.Web.UI.PageHandlerFactory 来处理管道来处理请求。
如果托管应用程序采用经典模式的应用程序池中运行,那么服务器会继续通过 Aspnet_isapi.dll 路由托管代码请求,其处理请求方式,就像应用程序在IIS 6 中运行。
解释:
经典模式 — 指的是与 IIS6 或之前版本保持兼容的一种模式
在经典模式中 IIS 拥有自己的管道,这些管道可以创建ISAPI扩展进行扩充,而ISAPI( Internet Server API )扩展是以难以开发而著称的,ASP.NET作为一个ISAPI扩展运行,只是IIS管道中的一项组成部分部分。
ASP.NET仅当IIS处理ISAPI扩展时才能够发挥作用,利用文件扩展名可以判断使用哪个ISAPI处理应用程序,例如可以将.aspx映射到asp.net_isapi.dll,可以将.asp映射到asp.dll,可以将.php映射到php.dll前提是你安装了php.dll
集成模式 — 这种全新的模式,允许我们更好的将ASP.NET与IIS集成,甚至允许我们在ASP.NET中编写一些功能(例如 Module)来改变IIS的行为。
集成的好处是,不通过ISAPI的方式,提高了速度和稳定性,至于扩展,则可以使得我们队IIS及其他类型请求有了更多的控制。IIS服务器的功能被划分为40多个模块,因此也就将IIS和ASP.NET功能划分为不同的组成部分
实验:
1. 经典模式,IIS 配置如下

2. 建一个WebForm站点,添加一个类 HttpModuleTest,该类 实现 IHttpModule 接口,并添加aaa-ccc三个静态文件(其实一个就够)


类代码如下:
public class HttpModuleTest:IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.BeginRequest += context_BeginRequest;
}
protected void context_BeginRequest(object sender,EventArgs e)
{
HttpApplication application = sender as HttpApplication;
HttpContext context = application.Context;
HttpResponse response= context.Response;
response.Clear();
response.Write("<p style='color:red'>ModileTest<p>");
response.End();
}
}
配置文件中,在节点 <system.web> 配置如下节点:
<httpModules>
<add name="HttpModuleTest" type="WebForm1.HttpModuleTest,WebForm1"/>
</httpModules>
运行站点结果如下:


可以看出,请求被 Module 实现的类拦截了,再请求静态文件试试结果如下:

可以看出,静态资源没有被拦截。
2. 集成模式,IIS 配置很简单,直接选择 “集成模式”, 不用多说
接下来讲 配置文件中的 节点 <httpModules>改为<modules>并移动到 <system.webServer> 节点下,
<system.webServer>
<modules>
<add name="HttpModuleTest" type="WebForm1.HttpModuleTest,WebForm1"/>
</modules>
</system.webServer>
运行程序,结果如下:


被拦截,再运行静态文件,结果如下:


额...也被拦截了,这是为毛呢?继续查资料;找到这么一段话,很有道理,也把经典模式与集成模式最根本的区别交代清楚了,如下:
在IIS 7.0 经典模式以及子啊IIS 6.0 中,ASP.NET 请求管道与Web服务器管道分离,模块仅应用于路由到 ASP.NET ISAPI 扩展的请求,如果请求的资源名未显示映射到ASP.NET ,则不会为该请求调用ASP.NET功能,所以ASP.NET 在运行时也不会处理该请求
而在 IIS7.0 集成模式下,由一个统一的管道处理所有的请求,当集成管道收到请求后,该请求将经历所有请求共有的一些阶段,这些极端由 RequestNotification 枚举表示,所有请求都可以配置为使用ASP.NET 功能,即使如.html未映射到ASP.NET,对HTML页面的请求仍会调用ASP.NET 模块,这也会使您对所用的资源请求使用ASP.NET 身份验证和授权
但是如果选择经典模式,如果想拦截 静态文件(非托管代码),需要编写WIN32的非托管代码通过插入ISAPI来实现aspnet_isapi.dll的扩展,但实际上进来的非托管代码请求会走两个管道,首先是IIS内部的本机代码拦截,然后是ISAPI托管代码,经典模式是为了保留与IIS6.0一致的处理方式。
此外配置文件中的如下代码:
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
</system.webServer>
是告诉 在集成模式 中 IIS 不去处理不兼容集成模式的配置方式
附录:
1. ISAPI — 全称是 Internet Server Application Programing Interface 叫 互联网服务端应用程序编程接口,是一组 API 函数,是一种用来开发扩展IIS程序强有力的方法。
参考资料:
1. 对 IIS 7 集成模式和经典模式的理解:http://www.cnblogs.com/Lawson/archive/2011/11/24/2261382.html
2. ASP.NET 请求管道、应用程序生命周期:http://blog.csdn.net/jumtre/article/details/50423766
真正的大师永远怀着一颗学徒的心。

浙公网安备 33010602011771号