﻿# 手動升級 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](/post/2010/05/06/Visual-Studio-2010-Launch-Event-ASPNET-4-Speech.aspx) 演講時有分享一些網站升級的注意事項，不過今天我特地將手動升級網站的完整過程記錄下來，讓各位按圖施工、保證成功！^\_^

要將原本 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 裡還有其他定義的設定請保留：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/412eee8ddfbaa5362b98-image_421.png) 

**移除 <system.codedom> 區段**

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/88438a1cd244275897d7-image_422.png)

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

![修正 <controls> 底下的新增項目，移除多餘的控制項宣告](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/5a6481d523f5b91c68cf-SNAGHTMLfffcddd.png "修正 <controls> 底下的新增項目，移除多餘的控制項宣告")

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

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/0f2304fd8b519bd0a6bc-image_423.png)

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

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/a69092f10567542bd32b-image_424.png)

**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> 標籤下。**

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b2a95df74d7c0ebe63d1-image_425.png)

**如果 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 之後的一段時間出現而已。**

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/3ef9f9e13787ef567a7c-image_426.png) 

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

![修正 <compilation debug="true"> 標籤，並新增 targetFramework="4.0" 屬性](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/e4d3dd739a412fcbfa1e-image_427.png "修正 <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" 屬性](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/d4f436e53e7475f22745-image_428.png "修正 <page> 新增 controlRenderingCompatibilityVersion=\"3.5\" clientIDMode=\"AutoID\" 屬性")

如果經由上述的修訂還無法讓網站正常執行的話，大多與個別組件有關，例如有安裝過 [Microsoft Chart Controls for Microsoft .NET Framework 3.5](http://www.microsoft.com/downloads/details.aspx?FamilyID=130f7986-bf49-4fe5-9ca8-910ae6ea442c&displaylang=zh-tw) 的人來說，雖然 Microsoft Chart Controls 已經內建於 .NET Framework 4.0 裡，但你還是可以安裝 [Microsoft Chart Controls for Microsoft .NET Framework 3.5](http://www.microsoft.com/downloads/details.aspx?FamilyID=130f7986-bf49-4fe5-9ca8-910ae6ea442c&displaylang=zh-tw) 來達到相容的目的，否則就要在 web.config 裡將組件版本全部改成 **4.0.0.0** 即可，如下圖示：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/82149d64ae93dabc97d6-image_429.png)

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/0b8eeb7121283074d6f8-image_430.png)

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

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

[![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ad3ff13a2071d9197710-image_thumb_48.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/37d33a651e728067c8b3-image_431.png)

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

[![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/35257366c2b93c52349a-image_thumb_49.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/7f14bf16f48461663d1b-image_432.png)

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

請參考筆者的【[ASP.NET 4.0 安裝在 IIS6 最常遇到的四個問題](/post/2010/06/22/IIS-6-ASPNET-4-Installation-Notes.aspx)】文章。

**相關連結**

-   [ASP.NET 4 Breaking Changes](http://www.asp.net/learn/whitepapers/aspnet4/breaking-changes)
-   [ASP.NET 4 和 Visual Web Developer 的新功能](http://msdn.microsoft.com/zh-tw/library/s57a598e.aspx)
-   [What's New in ASP.NET 4 and Visual Web Developer](http://msdn.microsoft.com/en-us/library/s57a598e.aspx)
