IIS經典模式和集成模式在管道模型中的不一樣

問題:web

有時候咱們配置IIS後可能運行提示如下錯誤:api

  HTTP 錯誤 500.23 - Internal Server Error服務器

  檢測到在集成的託管管道模式下不適用的 ASP.NET 設置。 性能

其中因爲在IIS7的應用程序池有兩種模式, 「集成模式」和「經典模式」。網站

經典模式 則是咱們之前習慣的IIS 6 的方式。spa

若是使用集成模式,那麼對自定義的httpModules 和 httpHandlers 就要修改配置文件,須要將他們轉移到<modules>和<hanlders>節裏去。插件

兩種解決方法: blog

第一種方法:配置應用程序池生命週期

在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插入ISAPIaspnet_isapi.dll的擴展,處理對靜態文件的攔截,但它實際會走兩個通道,首先是IIS內部的本機代碼攔截,而後是託管代碼ISAPI的攔截

IIS7集成模式還增長了MapRequestHandlerLogRequest  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處理擴展項設置爲容許

相關文章
相關標籤/搜索