原文轉載自:http://www.th7.cn/Program/net/201312/162233.shtml
問題:
有時候我們配置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集成管道下的事件生命週期如下:
集成模式是一種統一的請求處理管道,由上圖可以看到 ,集成模式下不管託管代碼還是本機代碼,都可以在身份驗證和執行處理程序被插入到內核代碼的託管代碼攔截,它將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內核代碼中來解析,方便大家精確控制任意請求,帶來更好的擴展性。