欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

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

程序员文章站 2022-04-26 13:46:05
在 iis 7.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

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

直接切换应用程序池成集成模式会发现页面输出为空。证明程序没有经过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 设置

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

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