

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 AWS 上現代化 ASP.NET Web Forms 應用程式
<a name="modernize-asp-net-web-forms-applications-on-aws"></a>

*Vijai Anand Ramalingam 和 Sreelaxmi Pai，Amazon Web Services*

## 總結
<a name="modernize-asp-net-web-forms-applications-on-aws-summary"></a>

此模式說明透過將舊版 ASP.NET Web Forms 應用程式移植到 AWS 上的 ASP.NET Core 來現代化舊版 Web Forms 應用程式的步驟。

將 ASP.NET Web Forms 應用程式移植到 ASP.NET Core 可協助您利用 Linux 的效能、節省成本和強大的生態系統。不過，這可能會是大量的手動工作。在此模式中，舊版應用程式會使用分階段方法逐步現代化，然後在 AWS 雲端中容器化。

考慮購物車的舊版整體應用程式。假設它是建立為 ASP.NET Web Forms 應用程式，並由具有程式碼後面 (`aspx.cs`) 檔案的 .aspx 頁面組成。現代化程序包含下列步驟：

1. 使用適當的分解模式，將整體分解為微服務。如需詳細資訊，請參閱 AWS 方案指引網站上的將[整體分解為微服務](https://docs.aws.amazon.com/prescriptive-guidance/latest/modernization-decomposing-monoliths/)指南。

1. 將舊版 ASP.NET Web Forms (.NET Framework) 應用程式移植到 .NET 5 或更新版本中的 ASP.NET Core。在此模式中，您可以使用適用於 .NET 的移植助理來掃描 ASP.NET Web Forms 應用程式，並識別與 ASP.NET Core 的不相容。這可減少手動移植工作。

1. 使用 React 重新開發 Web Forms UI layer。此模式不包含 UI 重新開發。如需說明，請參閱 [React 文件中的建立新的 React 應用程式](https://reactjs.org/docs/create-a-new-react-app.html)。

1. 將 Web 表單程式碼落後檔案 （業務界面） 重新開發為 ASP.NET Core Web API。此模式使用 NDepend 報告來協助識別必要的檔案和相依性。

1. 使用適用於 .NET 的移植助理，將舊版應用程式中的共用/常見專案，例如商業邏輯和資料存取，升級至 .NET 5 或更新版本。 

1. 新增 AWS 服務以補充您的應用程式。例如，您可以使用 [Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) 來監控、存放和存取應用程式的日誌，以及使用 [AWS Systems Manager](https://aws.amazon.com/systems-manager/) 來存放應用程式設定。

1. 容器化現代化 ASP.NET Core 應用程式。此模式會建立以 Visual Studio 中的 Linux 為目標的 Docker 檔案，並使用 Docker 桌面在本機進行測試。此步驟假設您的舊版應用程式已在內部部署或 Amazon Elastic Compute Cloud (Amazon EC2) Windows 執行個體上執行。如需詳細資訊，請參閱模式 在 [Amazon EC2 Linux 執行個體上執行 ASP.NET Core Web API Docker 容器](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html)。

1. 將現代化 ASP.NET 核心應用程式部署至 Amazon Elastic Container Service (Amazon ECS)。此模式不包含部署步驟。如需說明，請參閱 [Amazon ECS 研討會](https://ecsworkshop.com/)。

**注意**  
此模式不包含 UI 開發、資料庫現代化或容器部署步驟。

## 先決條件和限制
<a name="modernize-asp-net-web-forms-applications-on-aws-prereqs"></a>

**先決條件**
+ [Visual Studio](https://visualstudio.microsoft.com/downloads/) 或 [Visual Studio Code](https://code.visualstudio.com/download)，已下載並安裝。
+ 使用 AWS 管理主控台和 AWS Command Line Interface (AWS CLI) 第 2 版存取 AWS 帳戶。（請參閱[設定 AWS CLI 的說明](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)。)
+ AWS Toolkit for Visual Studio （請參閱[設定指示](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/setup.html))。
+ Docker Desktop，[已下載](https://www.docker.com/products/docker-desktop)並安裝。
+ .NET SDK，[已下載](https://download.visualstudio.microsoft.com/download/pr/4263dc3b-dc67-4f11-8d46-cc0ae86a232e/66782bbd04c53651f730b2e30a873f18/dotnet-sdk-5.0.203-win-x64.exe)並安裝。
+ NDepend 工具，[下載](https://www.ndepend.com/download)並安裝。若要安裝 Visual Studio 的 NDepend 延伸模組，請執行 `NDepend.VisualStudioExtension.Installer`([請參閱說明](https://www.ndepend.com/docs/getting-started-with-ndepend#Part1))。根據您的需求，您可以選擇 Visual Studio 2019 或 2022。 
+ 適用於 .NET 的移植助理，[已下載](https://aws.amazon.com/porting-assistant-dotnet/)並安裝。

## Architecture
<a name="modernize-asp-net-web-forms-applications-on-aws-architecture"></a>

**現代化購物車應用程式**

下圖說明舊版 ASP.NET 購物車應用程式的現代化程序。

![\[現代化傳統購物車應用程式\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/36cda8e6-f2cb-4f1a-b37f-fa3045cc5ba1/images/4367e259-9bb3-4eb6-a54d-1c1e2dece7d4.png)


**目標架構**

下圖說明 AWS 上現代化購物車應用程式的架構。ASP.NET Core Web APIs會部署到 Amazon ECS 叢集。記錄和組態服務由 Amazon CloudWatch Logs 和 AWS Systems Manager 提供。

![\[AWS 上 ASP.NET Web Forms 應用程式的目標架構\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/36cda8e6-f2cb-4f1a-b37f-fa3045cc5ba1/images/ed6d65ec-0dc9-43ab-ac07-1f172e089399.png)


## 工具
<a name="modernize-asp-net-web-forms-applications-on-aws-tools"></a>

**AWS 服務**
+ [Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html) – Amazon Elastic Container Service (Amazon ECS) 是一種高度可擴展的快速容器管理服務，用於執行、停止和管理叢集上的容器。您可以在 AWS Fargate 管理的無伺服器基礎設施上執行任務和服務。或者，若要進一步控制您的基礎設施，您可以在您管理的 EC2 執行個體叢集上執行任務和服務。
+ [Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) – Amazon CloudWatch Logs 會集中來自您使用之所有系統、應用程式和 AWS 服務的日誌。您可以檢視和監控日誌、搜尋特定錯誤代碼或模式、根據特定欄位篩選日誌，或安全地封存日誌以供未來分析。
+ [AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html) - AWS Systems Manager 是一種 AWS 服務，可用來檢視和控制 AWS 上的基礎設施。使用 Systems Manager 主控台，您可以檢視來自多個 AWS 服務的操作資料，並自動化 AWS 資源的操作任務。Systems Manager 會掃描受管執行個體，並在偵測到任何政策違規時回報 （或採取修正動作），以協助您維護安全性和合規性。

**工具**
+ [Visual Studio](https://visualstudio.microsoft.com/) 或 [Visual Studio 程式碼](https://code.visualstudio.com/) – 用於建置 .NET 應用程式、Web APIs和其他程式的工具。
+ [AWS Toolkit for Visual Studio](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/welcome.html) – Visual Studio 的延伸，可協助開發、偵錯和部署使用 AWS 服務的 .NET 應用程式。
+ [Docker Desktop](https://www.docker.com/products/docker-desktop) – 一種工具，可簡化建置和部署容器化應用程式。
+ [NDepend](https://www.ndepend.com/features/) – 監控 .NET 程式碼是否有相依性、品質問題和程式碼變更的分析器。
+ 適用於 [.NET 的移植助理](https://aws.amazon.com/porting-assistant-dotnet/) – 掃描 .NET 程式碼以識別與 .NET Core 不相容的分析工具，並估計遷移工作量。

## 史詩
<a name="modernize-asp-net-web-forms-applications-on-aws-epics"></a>

### 將舊版應用程式移植到 .NET 5 或更新版本
<a name="port-your-legacy-application-to-net-5-or-later-version"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將 your.NET Framework 舊版應用程式升級至 .NET 5。 | 您可以使用適用於 .NET 的移植助理，將舊版 ASP.NET Web Forms 應用程式轉換為 .NET 5 或更新版本。遵循[適用於 .NET 的移植助理文件中](https://docs.aws.amazon.com/portingassistant/latest/userguide/porting-assistant-getting-started.html)的指示。 | 應用程式開發人員 | 
| 產生 NDepend 報告。 | 當您將 ASP.NET Web Forms 應用程式分解為微服務來現代化時，您可能不需要舊版應用程式中的所有 .cs 檔案。您可以使用 NDepend 來產生任何程式碼後面 (.cs) 檔案的報告，以取得所有來電者和來電者。此報告可協助您識別和僅使用微服務中的必要檔案。安裝 NDepend 後 [（請參閱先決條件](#modernize-asp-net-web-forms-applications-on-aws-prereqs)區段），請在 Visual Studio 中開啟舊版應用程式的解決方案 (.sln 檔案），並遵循下列步驟：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/modernize-asp-net-web-forms-applications-on-aws.html)此程序會產生代碼後面檔案的報告，列出所有來電者和來電者。如需相依性圖表的詳細資訊，請參閱 [NDepend 文件](https://www.ndepend.com/docs/visual-studio-dependency-graph)。 | 應用程式開發人員 | 
| 建立新的 .NET 5 解決方案。 | 若要為現代化 ASP.NET Core Web APIs 建立新的 .NET 5 （或更新版本） 結構：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/modernize-asp-net-web-forms-applications-on-aws.html)如需建立專案和解決方案的詳細資訊，請參閱 [Visual Studio 文件](https://docs.microsoft.com/en-us/visualstudio/ide/creating-solutions-and-projects)。當您建置解決方案並驗證功能時，除了 NDepend 識別的檔案之外，您還可以識別要新增到解決方案的其他幾個檔案。 | 應用程式開發人員 | 

### 更新您的應用程式程式碼
<a name="update-your-application-code"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 使用 ASP.NET Core 實作 Web APIs。 | 假設您在舊版單體購物車應用程式中識別的其中一個微服務是*產品*。您已在上一個史詩中為*產品*建立新的 ASP.NET Core Web API 專案。在此步驟中，您會識別和現代化與 *產品*相關的所有 Web 表單 (.aspx 頁面）。假設*產品*由四個 Web 表單組成，如先前[架構](#modernize-asp-net-web-forms-applications-on-aws-architecture)一節所示：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/modernize-asp-net-web-forms-applications-on-aws.html)您應該分析每個 Web 表單、識別傳送至資料庫以執行一些邏輯的所有請求，以及取得回應。您可以實作每個請求做為 Web API 端點。鑑於其 Web 表單，*產品*可以有下列可能端點：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/modernize-asp-net-web-forms-applications-on-aws.html)如前所述，您也可以重複使用升級至 .NET 5 的所有其他專案，包括商業邏輯、資料存取和共用/常見專案。 | 應用程式開發人員 | 
| 設定 Amazon CloudWatch Logs。 | 您可以使用 [Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) 來監控、存放和存取應用程式的日誌。您可以使用 AWS 開發套件將資料記錄到 Amazon CloudWatch Logs。您也可以使用 [NLog](https://www.nuget.org/packages/AWS.Logger.NLog/)、Log[Log4Net](https://www.nuget.org/packages/AWS.Logger.Log4net/) 和 [ASP.NET Core 記錄架構等熱門 .NET 記錄架構](https://www.nuget.org/packages/AWS.Logger.AspNetCore/)，將 .NET 應用程式與 CloudWatch Logs 整合。如需此步驟的詳細資訊，請參閱部落格文章 [Amazon CloudWatch Logs 和 .NET Logging Frameworks](https://aws.amazon.com/blogs/developer/amazon-cloudwatch-logs-and-net-logging-frameworks/)。 | 應用程式開發人員 | 
| 設定 AWS Systems Manager 參數存放區。 | 您可以使用 [AWS Systems Manager 參數存放區](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-paramstore.html)，將連線字串與應用程式的程式碼分開存放應用程式設定。NuGet [packageAmazon.Extensions.Configuration.SystemsManager](https://www.nuget.org/packages/Amazon.Extensions.Configuration.SystemsManager/) 可簡化您的應用程式如何將這些設定從 AWS Systems Manager 參數存放區載入 .NET Core 組態系統。 如需此步驟的詳細資訊，請參閱 [ AWS Systems Manager 的部落格文章 .NET Core 組態提供者](https://aws.amazon.com/blogs/developer/net-core-configuration-provider-for-aws-systems-manager/)。 | 應用程式開發人員 | 

### 新增身分驗證和授權
<a name="add-authentication-and-authorization"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 使用共用 Cookie 進行身分驗證。 | 將傳統整體應用程式現代化是一種反覆程序，需要整體及其現代化版本才能共存。您可以使用共用 Cookie 來實現兩個版本之間的無縫身分驗證。舊版 ASP.NET 應用程式會繼續驗證使用者登入資料並發出 Cookie，同時現代化 ASP.NET Core 應用程式會驗證 Cookie。 如需說明和範例程式碼，請參閱[範例 GitHub 專案](https://github.com/aws-samples/dotnet-share-auth-cookie-between-monolith-and-modernized-apps)。 | 應用程式開發人員 | 

### 在本機建置和執行容器
<a name="build-and-run-the-container-locally"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 使用 Visual Studio 建立 Docker 映像。 | 在此步驟中，您會使用 Visual Studio for .NET Core Web API 來建立 Docker 檔案。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/modernize-asp-net-web-forms-applications-on-aws.html)Visual Studio 會為您的專案建立 Docker 檔案。如需 Docker 檔案範例，請參閱 Microsoft 網站上的[適用於 Docker 的 Visual Studio 容器工具](https://docs.microsoft.com/en-us/visualstudio/containers/overview)。 | 應用程式開發人員 | 
| 使用 Docker 桌面建置和執行容器。 | 現在您可以在 Docker 桌面中建置、建立和執行容器。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/modernize-asp-net-web-forms-applications-on-aws.html) | 應用程式開發人員 | 

## 相關資源
<a name="modernize-asp-net-web-forms-applications-on-aws-resources"></a>
+ [在 Amazon EC2 Linux 執行個體上執行 ASP.NET Core Web API Docker 容器](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html) (AWS 方案指引）
+ [Amazon ECS 研討會](https://ecsworkshop.com/)
+ [使用 AWS CloudFormation (AWS CloudFormation 文件） 透過 CodeDeploy 執行 ECS 藍/綠部署](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/blue-green.html) AWS CloudFormation 
+ [NDepend 入門 ](https://www.ndepend.com/docs/getting-started-with-ndepend)(NDepend 文件）
+ [.NET 的移植助理](https://aws.amazon.com/porting-assistant-dotnet/)

## 其他資訊
<a name="modernize-asp-net-web-forms-applications-on-aws-additional"></a>

下表提供舊版購物車應用程式的範例專案，以及現代化 ASP.NET Core 應用程式中的同等專案。

**舊版解決方案：**


| 
| 
| Project name (專案名稱) | 專案範本 | 目標架構 | 
| --- |--- |--- |
| 業務界面  | 類別程式庫  | .NET Framework  | 
| BusinessLogic  | 類別程式庫  | .NET Framework  | 
| WebApplication  | ASP.NET Framework Web 應用程式  | .NET Framework  | 
| UnitTests  | NUnit 測試專案  | .NET Framework  | 
| 共用 -> 常見  | 類別程式庫  | .NET Framework  | 
| 共用 -> 架構  | 類別程式庫  | .NET Framework  | 

**新解決方案：**


| 
| 
| Project name (專案名稱) | 專案範本 | 目標架構 | 
| --- |--- |--- |
| BusinessLogic  | 類別程式庫  | .NET 5.0  | 
| <WebAPI>  | ASP.NET Core Web API  | .NET 5.0  | 
| <WebAPI>。UnitTests  | NUnit 3 測試專案  | .NET 5.0  | 
| 共用 -> 常見  | 類別程式庫  | .NET 5.0  | 
| 共用 -> 架構  | 類別程式庫  | .NET 5.0  | 