The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

手動升級 ASP.NET 2.0 網站至 ASP.NET 4.0 的標準作業流程

目前公司的專案已經越來越多使用 .NET Framework 4.0 版本,然後舊有的網站有時後要增加一些功能或新增的功能會用到一些 .NET 4.0 編譯好的組件時就非常麻煩,要不就是重新編譯參考的組件到 2.0 版(但不一定會編譯成功),要不就是將舊有的 ASP.NET 網站直接升級到 ASP.NET 4.0,我在 VS2010 上市發表會:Web 開發效率提昇 - ASP.NET 4.0 演講時有分享一些網站升級的注意事項,不過今天我特地將手動升級網站的完整過程記錄下來,讓各位按圖施工、保證成功!^_^

要將原本 ASP.NET 2.0/3.5 網站升級至 ASP.NET 4.0 需要注意的地方只有 2 個地方:

  1. 修正 Web.config 設定檔,讓設定檔符合 ASP.NET 4.0 的要求,以及設定 ASP.NET 4.0 的執行方式完全與 ASP.NET 2.0/3.5 相容。請注意:升級網站完全不需要重新編譯網站,無論是網站專案 (Web Site) 或是網站應用程式專案(Web Application)
  2. 修正 IIS7 的應用程式集區所對應的 .NET 版本修正 IIS6 網站站台的 ASP.NET 版本

 

※ 以下介紹 修正 Web.config 設定檔 的修正步驟,主要區分成「移除多餘宣告」與「新增相容屬性」兩個部分:

1. 移除多餘的宣告(這些已經內建至 machine.config 的宣告)

從 <configSections> 區段移除

由於 ASP.NET 4.0 已經將許多在 ASP.NET 2.0/3.5 時經常需要載入的 <configSections> 區段內建到 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config 系統設定檔內,其中最常見的宣告就是 system.web.extensions 這個,所以必須要手動移除掉,避免重新定義而導致網站無法啟動。

如下標示的部分是要手動移除的地方,如果你的 Web.config 裡還有其他定義的設定請保留:

 

移除 <system.codedom> 區段

修正 <controls> 底下的新增項目,移除多餘的控制項宣告 (跟第 1 點一樣,部分控制項已內建)

修正 <controls> 底下的新增項目,移除多餘的控制項宣告

 IIS6 相關設定修正 <httpHandlers> , <httpModules> 移除多餘的宣告

IIS7 相關設定修正 <modules> , <handlers> 移除多餘的宣告

 

2. 新增 ASP.NET 4.0 必要的屬性以及增加可提高 ASP.NET 2.0/3.5 相容性的屬性

修正 <httpRuntime> 標籤,並新增 requestValidationMode="2.0" 屬性,加上該屬性之後可確保原本 ASP.NET 2.0/3.5 的 requestValidation 行為雖然在 ASP.NET 4.0 下編譯與執行但還能與舊版保持一致。主要是因為 ASP.NET 4.0 的要求驗證 (Request Validation) 變的比以前還要嚴謹,如果不加上的話很容易出現鬼打牆的狀況,因此如果在 web.config 找不到 <httpRuntime> 標籤的話,那就自己手動新增一個到 <system.web> 標籤下。

如果 web.config 裡沒有 <machineKey> 標籤的話,建議新增 <machineKey validation="SHA1" /> 上去,以確保與原本 ASP.NET 2.0/3.5 網站執行環境下正在使用的 Cookies, ViewState, Session 以及各種 ASP.NET 內建的加解密機制可以繼續沿用。不新增 <machineKey> 標籤的話,在升級至 ASP.NET 4.0 之後會在事件檢視器中看到 Viewstate MAC 的驗證失敗 的錯誤訊息,不過這錯誤只有在轉換至 ASP.NET 4.0 之後的一段時間出現而已。

 

修正 <compilation debug="true"> 標籤,並新增 targetFramework="4.0" 屬性,加上該屬性之後,該網站就會預設以 .NET Framework 4.0 進行編譯。

修正 <compilation debug="true"> 標籤,並新增 targetFramework="4.0" 屬性

修正 <page> 新增 controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID" 屬性,這兩個屬性主要目的是用來提升網站在 ASP.NET 4.0 模式執行時與 ASP.NET 2.0/3.5 的相容性,如需針對 ASP.NET 2.0 的控制項做相容,可將 controlRenderingCompatibilityVersion 設定為 2.0

修正 <page> 新增 controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID" 屬性

如果經由上述的修訂還無法讓網站正常執行的話,大多與個別組件有關,例如有安裝過 Microsoft Chart Controls for Microsoft .NET Framework 3.5 的人來說,雖然 Microsoft Chart Controls 已經內建於 .NET Framework 4.0 裡,但你還是可以安裝 Microsoft Chart Controls for Microsoft .NET Framework 3.5 來達到相容的目的,否則就要在 web.config 裡將組件版本全部改成 4.0.0.0 即可,如下圖示:

 

※ 接著介紹 修正 IIS7 的應用程式集區所對應的 .NET 版本 這部分有兩種設定方式:

1. 修改原本站台的基本設定,將應用程式集區切換至 ASP.NET v4.0 應用程式集區,此集區會在安裝完 .NET Framework 4.0 後自動安裝進 IIS 7 / 7.5

2. 修改原本站台所使用的應用程式集區,將 .NET Framework 版本切換至 .NET Framework v4.0.30319

 

※ 接著介紹 修正 IIS6 網站站台的 ASP.NET 版本

請參考筆者的【ASP.NET 4.0 安裝在 IIS6 最常遇到的四個問題】文章。

 

相關連結