IIS7部署報錯 500.22錯誤 檢查到這集成託管模式下不使用的ASP.NET配置
- 2019 年 10 月 4 日
- 筆記
公司的一個項目,環境為: .Net 4.0 + MVC3,部署在 Windows Server 2003R2 IIS6.0上面運行正常,遷移到新伺服器 Windows Server 2008R2,部署在 IIS7.0上, 應用程式池中,託管管道模式中選中了「集成」模式,如下圖:

其他配置如下:

配置完成後,訪問出錯報錯,

最後檢查出了原因:該項目中的 web.config 配置文件不適合 IIS7.0。
於是將應用程式池的管道模式選擇為「經典」模式

再次訪問一切正常。
問題的根本原因是 IIS7.0 的機制已經發生改變,不再與 IIS6.0 一樣,但是兼容 IIS6.0。
IIS7.0 對配置文件進行了一些修改,Web 開發人員可以使用這些修改內容。例如,<system.webServer> 節就是這樣一項修改,
無論是經典模式還是集成模式都可以識別<system.webServer>節,同時,<system.webServer> 節既可以在 applicationHost.config 文件中設置,也可以在 web.config 文件中設置。
<system.webServer>節既可以控制靜態頁面,也可以控制動態頁面。即使在經典模式中,<system.webServer>節也具有重要作用,它可以幫助Web開發人員在web.config文件中設置不同的IIS配置。
在集成模式中,HTTP模組和HTTP處理程式不再定義於<system.web>中,而是定義於<system.webServer>中。如果在集成模式中運行一個包括了HTTP模組或HTTP處理程式的web.config文件,那麼將會發生失效。幸運的是,微軟公司已經詳細規定了一個編號為500.22的錯誤資訊,這個錯誤資訊說明了如何一步步地遷移web.config文件。
利用AppCmd.exe工具,可以輕而易舉地完成文件的遷移工作。為了在Default Web Site上遷移web.config文件,可以執行以下AppCmd.exe命令:
- AppCmd.exe migrate config "Default Web Site/"
下面是一個web.config文件的例子,這個例子可以在IIS 6.0的經典模式下工作:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <system.web> 4 <httpModules> 5 <add type="classname, assemblyname" 6 name="modulename" /> 7 </httpModules> 8 </system.web> 9 </configuration>
AppCmd.exe migrate config命令運行結束後,web.config文件將被更新為以下內容:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <system.web> 4 <httpModules> 5 <add type="classname,assemblyname" 6 name="modulename" /> 7 </httpModules> 8 </system.web> 9 <system.webServer> 10 <modules> 11 <add name="modulename" 12 type="classname, assemblyname" 13 preCondition="managedHandler" /> 14 </modules> 15 <validation validateIntegratedModeConfiguration="false" /> 16 </system.webServer> 17 </configuration>
注意,web.config文件中仍然保留了httpModules節,其目的在於向後兼容,但是,在system.webServer中,modules節則處於優先的地位。
validateIntegratedMode Configuration屬性可以確保IIS不會因為存在遺留的<httpModules>節而產生問題。
集成管道模式是默認的管道模式,具有一些比較重要的優勢。我們需要做的就是遷移定義了HTTP處理程式和HTTP模組的所有web.config文件,從而確保其能夠在IIS 7.0下正常工作。