ASP.NET 2.0 移轉概觀

更新:2007 年 11 月

ASP.NET 2.0 版中仍然保留了許多舊版 ASP.NET 中所使用的程式設計概念,所以在 ASP.NET 2.0 中開發應用程式對 ASP.NET 1.x 的使用者而言並不陌生。ASP.NET 2.0 所執行的作業系統和硬體需求與 ASP.NET 1.x 應用程式的相同,包括 Microsoft Windows 2000 和 Microsoft Internet Information Services (IIS) 5.0、Microsoft Windows XP 和 IIS 5.1,以及 Microsoft Windows Server 2003 和 IIS 6.0。

如果您已經決定要將某個現有的 Web 應用程式移轉至 ASP.NET,請務必在移轉之前了解 ASP.NET 2.0 的新功能。最重要的變更包括頁面程式碼後置 (Code-Behind) 模型、Web 應用程式資料夾結構,以及頁面編譯模型。

進行移轉之前,必須先確定 ASP.NET 1.x 應用程式可加以編譯,而且執行的 .NET Framework 版本與開發的版本相同。同時,請確認 Microsoft .NET Framework 2.0 已安裝並執行中,然後才開始進行移轉。

這個主題涵蓋了必須在移轉之前考量的一般事項。本主題將討論下列各節:

  • 移轉的優點

  • 網頁模型

  • 跨 ASP.NET 版本共用資料

  • 跨 ASP.NET 版本的表單驗證

  • 名稱衝突

  • 標記相容

  • HttpOnly 和跨站台的指令碼

移轉的優點

將您的 Web 應用程式移轉至 ASP.NET 2.0 有許多優點,包括改善的標記和程式碼分離、保留的應用程式資料夾,以及自動化的程式碼編譯。

以部分類別為基礎的新程式碼後置模型可更有效地分離標記和程式碼,而且不需要在程式碼後置的檔案中放置控制項宣告和事件連接程式碼。在 ASP.NET 頁面編譯模型中,程式碼後置的檔案會在執行階段於首次要求對應的 .aspx 檔時編譯成多個組件。

ASP.NET 現在使用以保留資料夾為基礎的改善 Web 應用程式結構。這些資料夾含有特定內容,可協助您更有效率地組織應用程式。某些保留的資料夾 (例如 App_Data) 並不會回應 Web 要求而提供內容,但可以從應用程式程式碼中存取其內容。如需詳細資訊,請參閱 ASP.NET 網站結構

當要求網站上的資源時,ASP.NET 2.0 編譯器會自動編譯應用程式的程式碼和相依的資源。例如,在 ASP.NET 2.0 中,對現有 Web 網頁或相依資源的變更可輕易地儲存,並針對要重新編譯的頁面和資源重新要求頁面。這項功能所適用的資源包括 App_Code 資料夾中的程式碼檔、App_GlobalResources 和 App_LocalResources 資料夾中的資源檔,以及 App_Themes 資料夾中的佈景主題。如需網頁編譯模型的詳細資訊,請參閱 ASP.NET 編譯概觀

如果您要移轉大型應用程式,建議您使用 Visual Web Developer 2005、Visual Web Developer 2005 Express 版、Visual Studio 2005 或 Visual Studio 2005 Team System,因為它們每一個都具有移轉精靈,可將一般移轉作業中所涉及的許多工作自動化。此精靈會進行必要的變更,以便將 ASP.NET 1.x Web 應用程式轉換成 ASP.NET 2.0。

其實不一定要移轉 Web 應用程式,因為 ASP.NET 2.0 提供了與舊版的高度回溯相容性 (Backward Compatibility)。如果您不移轉,仍然可以在 Web 應用程式中使用許多 ASP.NET 2.0 的新功能,不過前提是您的應用程式要使用 .NET Framework 2.0。若要將您的現有 Web 應用程式設定為使用 .NET Framework 2.0,請參閱 HOW TO:在 .NET Framework 2.0 中執行 ASP.NET 1.x 應用程式

網頁模型

ASP.NET 程式碼後置的 Web 網頁模型可以讓您將 Web 網頁的標記儲存在某一個檔案 (.aspx 檔案),而將程式碼儲存在另一個檔案 (程式碼後置的檔案)。ASP.NET 2.0 的程式碼後置模型與舊版不同之處在於,它使用了被稱為部分類別的新語言功能。ASP.NET 2.0 中的新程式碼後置模型比舊版 ASP.NET 允許更有效地分離標記和程式碼。

使用舊版程式碼後置模型 (以 @ Page 指示詞的 CodeBehind 屬性為基礎) 的 Web 網頁將可繼續在 ASP.NET 2.0 中運作。不過,建議您在程式碼後置檔案中使用 @ Page 指示詞的 CodeFile 屬性和部分類別定義,將這些網頁移轉至新的程式碼後置模型,以便運用改善的標記和程式碼分離以及自動化的頁面編譯。使用舊版程式碼後置模型的 Web 網頁則必須手動加以編譯。

您可以手動進行變更 (如 HOW TO:將使用 CodeBehind 屬性的 ASP.NET 1.1 Web 網頁移轉至 ASP.NET 2.0 中所述),也可以使用含有移轉精靈的其中一個 Microsoft Visual Studio 2005 版本 (例如 Visual Web Developer 2005 Express 版)。

ASP.NET 1.1 版也會支援程式碼後置模型的變異形式,其中會以 Src 屬性取代 @ Page 指示詞的 CodeBehind 屬性。使用 Src 屬性的 Web 網頁將可繼續在 ASP.NET 2.0 中運作而且不需要修改即可執行。

相較於程式碼後置模型,單一檔案網頁模型可以將網頁的標記和程式碼放置在同一個實體 .aspx 檔案,是一個不錯的替代方式。舊版 ASP.NET 的單一檔案網頁將可繼續在 ASP.NET 2.0 中運作而且不需要修改即可執行。

跨 ASP.NET 版本共用資料

您可以選擇將網站的某些部分移轉至 ASP.NET 2.0 而保留其他部分不修改。如果您的網站是分成相互獨立但一起運作以提供網站功能的 Web 應用程式,您可能會選擇移轉有些應用程式,有些則否。在這種案例中,您就無法在已移轉的應用程式和未移轉的應用程式之間共用應用程式狀態。除非您提供可同時從 ASP.NET 1.x 和 ASP.NET 2.0 頁面存取的自訂工作階段狀態方案,否則同樣無法在應用程式之間共用工作階段狀態。如需詳細資訊,請參閱實作工作階段狀態存放區提供者

跨 ASP.NET 版本的表單驗證

表單驗證提供方法讓您使用自己的程式碼驗證使用者,然後在 Cookie 或網頁 URL 中維護驗證語彙基元 (Token)。ASP.NET 表單驗證可在執行不同 ASP.NET 版本的應用程式之間運作,如此某個版本所核發的驗證票證可由其他版本使用。

將驗證設定為跨 ASP.NET 版本運作與跨 Web 伺服器 (Web 伺服陣列) 網路設定驗證的程序很類似。在這兩種情況中,您都會明確設定 machineKey 項目的 validationKey 和 decryptionKey 屬性,以便讓應用程式共用具有相同金鑰的驗證票證。若要支援跨 ASP.NET 版本的驗證,您必須進行其他組態變更,也就是將 ASP.NET 2.0 應用程式之 Web.config 檔中的 machineKey 項目的 decryption 屬性設定為 3DES。ASP.NET 2.0 的預設加密 (Encryption) 為 AES,而舊版 ASP.NET 則使用 3DES。如需詳細資訊,請參閱 ASP.NET 表單驗證概觀

名稱衝突

進行移轉之前,建議您掃描 Web 應用程式並搜尋與 .NET Framework 2.0 中的功能類別和命名空間 (Namespace) 發生衝突的名稱。當快取、成員資格、設定檔和角色等等之類的通用名稱同時在 Web 應用程式和 .NET Framework 中使用時,就可能會發生衝突。若要避免命名衝突,請在您的程式碼中找出有問題的名稱參考,並使用完整的參考。

ASP.NET 2.0 與舊版使用不同的網站配置。為了更容易使用 Web 應用程式,ASP.NET 會保留可用於特定類型內容的某些資料夾和檔案名稱。保留資料夾中的內容不會服務針對此內容所進行的 Web 要求。這可能會在您的現有應用程式中導致問題。因此,在移轉個別的應用程式檔案之前,建議您變更與 ASP.NET 2.0 保留資料夾和檔案名稱衝突的所有應用程式資料夾或檔案名稱。如需 ASP.NET 網站配置中保留的資料夾之詳細資訊,請參閱 ASP.NET 網站配置

標記相容

根據預設,ASP.NET 產生的所有標記和 ASP.NET 所包含的 Web 伺服器控制項,現在都符合 XHTML 1.0 Transitional 標準。在移轉之後,這可能會導致非預期的 HTML 呈現問題。若要協助移轉 Web 應用程式,您可以將 Web.config 檔中 xhtmlConformance 項目的 mode 屬性設定為 Legacy。這應該是移轉程序中的暫時步驟。就長期而言,建議您將 xhtmlConformance 項目的 mode 屬性設定為 Transitional,然後執行應用程式。此外,建議您將 DOCTYPE 項目加入至已移轉的頁面。如需讓 Web 網頁符合 XHTML 標準之優點的詳細資訊,請參閱 ASP.NET 和 XHTML

HttpOnly 和跨站台的指令碼

HttpCookie 類別的 HttpOnly 屬性是 .NET Framework 2.0 的新功能。將這個屬性設為 true 可以減低跨站台的指令碼攻擊。針對表單驗證 Cookie 和工作階段 ID Cookie,會自動將 HttpOnly 屬性設為 true,讓用戶端指令碼無法使用這些 Cookie。如果已移轉的 Web 網頁擲回 NullReferenceException 例外狀況 (Exception),有可能是表示遺失了用戶端的工作階段,因為 HttpOnly 屬性已經設定為 true。在這種情況下,您可以使用下列其中一個解決方式:

  • 在 Global.asax 檔案內 HttpApplication 類別的 EndRequest 事件處理常式中,將每個 Cookie 的 HttpOnly 屬性設為 false。

  • 撰寫複製 Cookie 至另一個 Cookie 並清除 HttpOnly 屬性的自訂模組,這樣用戶端指令碼就可以對其加以管理。

  • 撰寫不將 HttpOnly 屬性設為 true.的自訂工作階段 ID 管理員。

如需跨站台之指令碼移轉的詳細資訊,請參閱使用 HTTPOnly Cookie 移轉跨站台的指令碼 (英文)。

請參閱

概念

Web 應用程式專案概觀

ASP.NET 表單驗證概觀

參考

machineKey 項目 (ASP.NET 設定結構描述)