技术解析

IIS7.5应用程序池集成模式和经典模式的区别介绍
0
2020-08-06 22:45:06
taohocal

在IIS 7.5中,应用程序池有两种运行模式:集成模式和经典模式。


应用程序池模式会影响服务器处理托管代码请求的方式。


如果托管应用程序在采用集成模式的应用程序池中运行,服务器将使用IIS和ASP.NET的集成请求处理管道来处理请求。


如果托管应用程序在采用经典模式的应用程序池中运行,服务器会继续通过Aspnet_isapi.dll路由托管代码请求,其处理请求的方式就像应用程序在IIS 6.0中运行一样。


经典模式:


  指的是与IIS 6或之前版本保持兼容的一种模式,一个典型问题就是,在处理ASP.NET这种动态网站的时候,它是通过一个所谓的ISAPI程序,作为插件的方式来工作的。针对不同的动态应用程序(例如ASP,PHP等),会需要不同的ISAPI。


集成模式:


  这种全新的模式,允许我们将ASP.NET更好地与IIS集成,甚至允许我们在ASP.NET中编写一些功能(例如Module)来改变IIS的行为(扩展)。集成的好处是,不再通过ISAPI的方式,提高了速度和稳定性。至于扩展,则可以使我们对于IIS以及其他类型的请求有更多的控制。


这次就主要介绍下httpHandler和httpModule在集成和经典模式下的区别。很多文件上传等都是需要使用到httpModule去实现。所以用httpModule作为测试案例


。1 . 新建测试网站WebApplication,加入MyHttpModule类实现IHttpModule接口,主要目的是测试程序是否经过了HttpModule,经过的在页面输出HttpModule字符。


公共类MyHttpModule:IHttpModule 

公共无效Dispose() 

公共无效的初始化(HttpApplication上下文) 

context.BeginRequest + = context_BeginRequest; 

受保护的void context_BeginRequest(对象发送者,EventArgs e) 

var context =发送者为HttpApplication; 

context.Response.Clear(); 

context.Response.Write(“ HttpModule”); 

context.Response.End(); 


2、2。在IIS7.5部署网站上,首先使用经典模式应用程序池。在web.config的<system.web>的子例程<httpModules>加入<add name =“ MyHttpModule” type =“ WebApplication.MyHttpModule, Web应用程序” />


<httpHandlers> 

<删除动词=“ *” path =“ *。asmx” /> 

<add verb =“ *” path =“ *。asmx” validate =“ false” type =“ System.Web.Script.Services.ScriptHandlerFactory,System.Web.Extensions,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = 31BF3856AD364E35“ /> 

<add verb =“ *” path =“ * _ AppService.axd” validate =“ false” type =“ System.Web.Script.Services.ScriptHandlerFactory,System.Web.Extensions,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = 31BF3856AD364E35“ /> 

<add verb =“ GET,HEAD” path =“ ScriptResource.axd” type =“ System.Web.Handlers.ScriptResourceHandler,System.Web.Extensions,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = 31BF3856AD364E35” validate =“错误“ /> 

</ httpHandlers> 

<httpModules> 

<add name =“ MyHttpModule” type =“ WebApplication.MyHttpModule,WebApplication” /> 

<add name =“ ScriptModule” type =“ System.Web.Handlers.ScriptModule,System.Web.Extensions,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = 31BF3856AD364E35” /> 

</ httpModules> 


访问网站可以发现页面输出如下,说明程序经过了HttpModule




证明程序没有通过HttpModule。那在集成模式下HttpModule如何才能执行呢?之前部署URLRewriter的时候查资料只知道需要<system.webServer> <modules> 。注册的HttpModule仔细查看配置文件会发现有一段如下英文意思大概就是IIS7版本的设置之前版本无需设置。

<! -

需要在Internet上运行ASP.NET AJAX的system.webServer部分

信息服务7.0。IIS的早期版本没有必要。

->

这样就大概明白意思是iis7.0之后有部分Web配置移动到system.webServer中。参考相关得到答案确实如此详细资料见http://www.cnblogs.com/buaaboyi/archive/2011/01 /20/1939903.html


于是在<system.webServer> <模块>中加入配置如下,刷新页面,页面能够输出字符HttpModule,证明成功了。

<system.webServer> 

<validation validateIntegratedModeConfiguration =“ false” /> 

<模块> 

<remove name =“ ScriptModule” /> 

<add name =“ MyHttpModule” type =“ WebApplication.MyHttpModule,WebApplication” /> 

<add name =“ ScriptModule” preCondition =“ managedHandler” type =“ System.Web.Handlers.ScriptModule,System.Web.Extensions,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = 31BF3856AD364E35” /> 

</ modules>

由于在升级过程成有一个站点出现HTTP错误500.22-内部服务器错误检测到在集成的托管管道模式下不适用的ASP.NET设置


数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服