设为首页 收藏本站
查看: 939|回复: 0

[经验分享] IIS经典模式和集成模式在管道模型中的不同

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-8-13 08:53:19 | 显示全部楼层 |阅读模式
  问题:
  有时候我们配置IIS后可能运行提示以下错误:
  HTTP 错误 500.23 - Internal Server Error
  检测到在集成的托管管道模式下不适用的 ASP.NET 设置。
  其中由于在IIS7的应用程序池有两种模式, “集成模式”和“经典模式”。
  经典模式 则是我们以前习惯的IIS 6 的方式。
  如果使用集成模式,那么对自定义的httpModules 和 httpHandlers 就要修改配置文件,需要将他们转移到<modules>和<hanlders>节里去。
  两种解决方法:
  第一种方法:配置应用程序池
  在IIS7上配置应用程序池,并且将程序池的模式改为“经典”,之后一切正常。  
  但这样只是权宜之计,用了IIS7.x,但实际只发挥了6的功能
  第二种方法:修改web.config配置文件:
  例如原先设置(你的环境中可能没有httpModules,httpHandlers节点)
  <system.web>
  ............
  <httpModules>
  <add name="WebbHttpModule" type="Webb.WAVE.Controls.Upload.WebbHttpModule, Webb.WAVE.Controls.Upload" />
  <add name="rewriteUrl" type="RewritUrl.Rw,RewritUrl" />
  </httpModules>
    <httpHandlers>
      <add path="*.myh" verb="GET" type="MyHandler" />
    </httpHandlers>
  
</system.web>
在IIS7应用程序池为“集成模式”时,改为:
  <system.web>
  ...........
  </system.web>
  <system.webServer>
  <modules>
  <add name="WebbHttpModule" type="Webb.WAVE.Controls.Upload.WebbHttpModule, Webb.WAVE.Controls.Upload" />
        <add name="rewriteUrl" type="RewritUrl.Rw,RewritUrl" />
  </modules>
    <handlers>
      <add name="MyHandler" path="*.myh" verb="GET" type="MyHandler" preCondition="integratedMode" />
    </handlers>
  </system.webServer>
(如果你的web.config没有httpModules,httpHandlers节点,则直接在节点system.webServer中添加:
  <validation validateIntegratedModeConfiguration="false" />  
这样可以禁止验证集成模式,避免错误提示。
经典模式(classic mode)和集成模式(Integrated mode)比较
  在经典模式下,IIS会用ISAPI扩展(ISAPI extension aspnet_isapi.dll)和 ISAPI过滤器(ISAPI filter aspnet_filter.dll)来调用ASP.NET运行库来处理请求。如果使用经典模式的话,服务器会用两种管道来处理请求一个负责源代码,另外一个负责托管代码。在这种模式下,应用程序不能充分使用IIS7.X提供的服务。
  微软官方一篇文章的图,介绍IIS7集成管道下的事件生命周期如下:
DSC0000.jpg
集成模式是一种统一的请求处理管道,由上图可以看到 ,集成模式下不管托管代码还是本机代码,都可以在身份验证和执行处理程序被插入到内核代码的托管代码拦截,它将ASP.NET请求管道与IIS核心管道组合在一起,ASP.NET从IIS插件(IIS extension)的角色进入了IIS的核心去监测每个请求和操作。并且可以有效的提高网站的性能。 有些在IIS6开发的代码需要运行于经典模式,因为在集成模式下会出现错误信息。
  网上解释:在IIS6下,要想拦截本机代码,比如静态文件,需要编写WIN32的非托管代码,但它也保留扩展的ISAPI,我们可以写托管代码拦截托管文件的请求。虽然IIS6也可以通过IIS插入ISAPI为aspnet_isapi.dll的扩展,处理对静态文件的拦截,但它实际会走两个通道,首先是IIS内部的本机代码拦截,然后是托管代码ISAPI的拦截
IIS7集成模式还增加了MapRequestHandler、LogRequest 和 PostLogRequest 事件,如果在经典模式下加了这些处理事件,会抛出:此操作要求使用 IIS 集成管线模式。如果集成模式下不让IIS处理不兼容集成模式的配置以及处理方式,可以在web.config中配置:

<system.webServer>

    <validation validateIntegratedModeConfiguration="false" />

   </system.webServer>即可。
  实际上IIS7集成模式,就是让用户可以通过编写托管代码的handlers、modules等模块,把托管代码插入到IIS内核代码中来解析,方便大家精确控制任意请求,带来更好的扩展性。
  问题二:
  详细错误:HTTP 错误 404.2 - Not Found. 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法处理您请求的页面的扩展.
  出现环境:win7 + IIS7.0   网站应用程序池  托管管道模型为经典模式  由上文可知 在该模式下DotNet托管环境和IIS 处理模块是分开的
  解决办法:点击IIS的根节点->右侧IIS功能中找到“ISAPI和CGI限制”->把禁止的针对网站下DotNet版本中aspnet_isapi.dll处理扩展项设置为允许

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-98207-1-1.html 上篇帖子: 启用Gzip压缩(IIS)提高客户端网站访问速度 下篇帖子: 2003server SP2 无法安装IIS 的解决办法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表