IIS7.5应用程序池集成模式和经典模式的区别介绍
在 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上的部署有了一定了解了。