当前位置: 移动技术网 > 网络运营>服务器>Windows > IIS7.5应用程序池集成模式和经典模式的区别介绍

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

2019年06月01日  | 移动技术网网络运营  | 我要评论

在 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去实现。我今天就出现了neatupload在iis7.5下出现未将对象引用到设计实例的错误。所以用httpmodule作为测试案例。

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

public class myhttpmodule : ihttpmodule 
{ 
public void dispose() 
{ 
} 
public void init(httpapplication context) 
{ 
context.beginrequest += context_beginrequest; 
} 
protected void context_beginrequest(object sender, eventargs e) 
{ 
var context = sender as 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, webapplication"/>

<httphandlers> 
<remove verb="*" 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="false"/> 
</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版本的设置。之前版本无需设置。
<!--
the system.webserver section is required for running asp.net ajax under internet
information services 7.0. it is not necessary for previous version of iis.
-->
这样就大概明白意思是iis7.0之后有部分web配置移动到system.webserver中。查阅相关得到答案确实如此 详细资料见 http://www.cnblogs.com/buaaboyi/archive/2011/01/20/1939903.html

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

<system.webserver> 
<validation validateintegratedmodeconfiguration="false"/> 
<modules> 
<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 - internal server error 检测到在集成的托管管道模式下不适用的 asp.net 设置


当时在比较急的情况下就直接删除了 <system.web> 的子节点<httpmodules> 程序正常运行。后面通过仔细和正常的站点对比是发现是缺少 <validation validateintegratedmodeconfiguration="false"/> 这个导致,这个主要作用是设置不检测 <system.web>中的配置

经过这今天的折腾终于是对iis7.5上的部署有了一定了解了。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网