[集成与经典] 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
 
 
posted @ 2019-04-23 07:04  NCat  阅读(1187)  评论(0)    收藏  举报