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命令:

  1. 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下正常工作。