

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在 AWS 上实现 ASP.NET Web 表单应用程序的现代化
<a name="modernize-asp-net-web-forms-applications-on-aws"></a>

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

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

此模式描述了通过将传统单体 ASP.NET Web 窗体应用程序移植到 AWS 上的 ASP.NET Core 来实现其现代化的步骤。

将 ASP.NET Web 窗体应用程序移植到 ASP.NET Core 可帮助您利用 Linux 的性能、成本节约和强大的生态系统。不过，这可能需要大量的人工操作。在此模式中，使用分阶段方法逐步对旧应用程序进行现代化改造，然后在 Amazon Web Services Cloud 中容器化。

考虑一个用于购物车的传统单体应用程序。假设它是作为 ASP.NET Web 窗体应用程序创建的，并且由带有代码隐藏 (`aspx.cs`) 文件的 .aspx 页组成。现代化过程包括以下步骤：

1. 使用适当的分解模式将单体分解为微服务。有关更多信息，请参阅 AWS Prescriptive Guidance 网站上的指南[将单体架构分解为微服务](https://docs.aws.amazon.com/prescriptive-guidance/latest/modernization-decomposing-monoliths/)。

1. 将传统 ASP.NET Web 窗体 (.NET Framework) 应用程序移植到 .NET 5 或更高版本中的 ASP.NET Core。在此模式中，使用 Porting Assistant for .NET 扫描 ASP.NET Web 窗体应用程序，并确定与 ASP.NET Core 的不兼容。这减少了手动移植的工作量。

1. 使用 React 重新开发 Web 表单用户界面层。此模式不涵盖 UI 重新开发。有关说明，请参阅 React 文档中的[创建新的 React 应用程序](https://reactjs.org/docs/create-a-new-react-app.html)。

1. 将 Web 窗体代码后置文件（业务接口）重新开发为 ASP.NET Core Web API。此模式使用 NDepend 报告来帮助识别所需的文件和依赖关系。

1. 使用适用于.NET 的 Porting Assistant，将旧版应用程序中的 shared/common 项目（例如业务逻辑和数据访问）升级到.NET 5 或更高版本。 

1. 添加 Amazon Web Services 来补充您的应用程序。例如，您可以使用 [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 Desktop 在本地对其进行测试。此步骤假设您的旧版应用程序已在本地或亚马逊弹性计算云 (Amazon EC2) Windows 实例上运行。有关更多信息，请参阅在[亚马逊 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 Core 应用程序部署到 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 命令行界面(AWS CLI) 版本 2 访问 Amazon Web Services account。（请参阅[配置 AWS CLI 的说明](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)。）
+ Visual Studio 的 AWS Toolkit（请参阅[设置说明](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，具体取决于你的要求。 
+ Porting Assistant for .NET，[已下载](https://aws.amazon.com/porting-assistant-dotnet/)并安装。

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

**实现购物车应用程序的现代化**

下图演示了旧版 ASP.NET 购物车应用程序的现代化过程。

![\[对旧式购物车应用程序进行现代化改造\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/36cda8e6-f2cb-4f1a-b37f-fa3045cc5ba1/images/4367e259-9bb3-4eb6-a54d-1c1e2dece7d4.png)


**目标架构**

下图说明了 AWS 上现代化购物车应用程序的架构。ASP.NET Cor APIs e Web 部署到亚马逊 ECS 集群。日志和配置服务由 Amazon CloudWatch Logs 和 AWS Systems Manager 提供。

![\[AWS 上 ASP.NET Web 表单应用程序的目标架构\]](http://docs.aws.amazon.com/zh_cn/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>

**Amazon Web Services**
+ [Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html) - Amazon Elastic Container Service (Amazon ECS) 是一项高度可扩展的快速容器管理服务，可助您轻松运行、停止和管理集群上的容器。您可以在由 AWS Fargate 托管的无服务器基础设施上运行任务和服务。或者，为了更好地控制您的基础架构，您可以在自己管理的 EC2 实例集群上运行任务和服务。
+ [Amazon CloudWatch 日 CloudWatch 志](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) — Amazon Logs 集中您使用的所有系统、应用程序和 AWS 服务的日志。您可以查看和监控日志，搜索特定的错误代码或模式，根据特定字段过滤日志，或将日志安全存档以备将来分析。
+ [AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html) - AWS Systems Manager 是一项 Amazon Web Services，可用于查看和控制 AWS 上的基础设施。使用 Systems Manager 控制台，您可查看来自多个 Amazon Web Services 的操作数据并在 AWS 资源之间自动执行操作任务。Systems Manager 通过扫描托管实例并报告其检测到的所有策略违规行为（或采取纠正措施）来帮助您维护安全性与合规性。

**工具**
+ [Visual Stud](https://visualstudio.microsoft.com/) io 或 [Visual Studio Code](https://code.visualstudio.com/) — 用于构建.NET 应用程序 APIs、Web 和其他程序的工具。
+ [AWS Toolkit for Visual Studio](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/welcome.html) - Visual Studio 的扩展，可帮助开发、调试和部署使用 Amazon Web Services 的 .NET 应用程序。
+ [Docker Desktop](https://www.docker.com/products/docker-desktop) - 一种简化构建和部署容器化应用程序的工具。
+ [NDepend](https://www.ndepend.com/features/)— 一种用于监视.NET 代码的依赖关系、质量问题和代码更改的分析器。
+ [Porting Assistant for .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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将 .NET Framework 旧应用程序升级到 .NET 5。 | 您可以使用 Porting Assistant for .NET 将旧版 ASP.NET Web Forms 应用程序转换为 .NET 5 或更高版本。请按照 [Porting Assistant for .NET 文档](https://docs.aws.amazon.com/portingassistant/latest/userguide/porting-assistant-getting-started.html)中的说明进行操作。 | 应用程序开发人员 | 
| 生成 NDepend 报告。 | 当您通过将 ASP.NET Web 窗体应用程序分解为微服务来实现现代化时，您可能不需要旧应用程序中的所有 .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_cn/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 网页创建新的.NET 5（或更高版本）结构，请执行以下操作： APIs[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
|  APIs 使用 ASP.NET 核心实现网页。 | 假设您在旧版单体购物车应用程序中确定的微服务之一为*产品*。你在上一个操作说明中为*产品*创建了一个新的 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_cn/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_cn/prescriptive-guidance/latest/patterns/modernize-asp-net-web-forms-applications-on-aws.html)如前所述，您还可以重复使用升级到.NET 5 的所有其他项目，包括业务逻辑、数据访问和 shared/common 项目。 | 应用程序开发人员 | 
| 配置 Amazon CloudWatch 日志。 | 您可以使用 [Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) 来监控、存储和访问应用程序的日志。您可以使用 AWS 软件开发工具包将数据记录到 Amazon CloudWatch 日志中。您还可以使用流行的.NET CloudWatch 日志框架（例如 [Log4](https://www.nuget.org/packages/AWS.Logger.Log4net/) Net 和 ASP.NET C [ore 日志框架）将.NET](https://www.nuget.org/packages/AWS.Logger.AspNetCore/) 应用程序与日志集成。[NLog](https://www.nuget.org/packages/AWS.Logger.NLog/)有关此步骤的更多信息，请参阅博客文章 [Amazon CloudWatch 日志和.NET 日志框架](https://aws.amazon.com/blogs/developer/amazon-cloudwatch-logs-and-net-logging-frameworks/)。 | 应用程序开发人员 | 
| 配置 AWS Systems Manager Parameter Store。 | 您可以使用 [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-paramstore.html) 来存储应用程序设置，例如与应用程序代码分开的连接字符串。[Amazon.extens.Configurat NuGet SystemsManager](https://www.nuget.org/packages/Amazon.Extensions.Configuration.SystemsManager/)简化了应用程序将这些设置从 AWS Systems Manager Parameter Store 加载到.NET 核心配置系统的方式。 有关此步骤的更多信息，请参阅博客文章 [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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用共享 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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用 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_cn/prescriptive-guidance/latest/patterns/modernize-asp-net-web-forms-applications-on-aws.html)Visual Studio 为您的项目创建一个 Docker 文件。有关示例 Docker 文件，请参阅 Microsoft 网站上的 [Visual Studio Container Tools for Docker](https://docs.microsoft.com/en-us/visualstudio/containers/overview)。 | 应用程序开发人员 | 
| 使用 Docker Desktop 构建并运行容器。 | 现在您可以在 Docker Desktop 中构建、创建和运行容器。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/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>
+ [在亚马逊 EC2 Linux 实例上运行 ASP.NET Core Web API Docker 容器（AWS Prescriptive Gu](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) idence）
+ [Amazon ECS 研讨会](https://ecsworkshop.com/)
+ [ CodeDeploy 使用 AWS 执行 ECS blue/green 部署 CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/blue-green.html)（AWS CloudFormation 文档）
+ [入门 NDepend](https://www.ndepend.com/docs/getting-started-with-ndepend)（NDepend 文档）
+ [Porting Assistant for .NET](https://aws.amazon.com/porting-assistant-dotnet/)

## 附加信息
<a name="modernize-asp-net-web-forms-applications-on-aws-additional"></a>

下表提供了旧版购物车应用程序的示例项目示例，以及新式 ASP.NET Core 应用程序中的等效项目。

**传统解决方案：**


| 
| 
| 项目名称 | 项目模板 | 目标架构 | 
| --- |--- |--- |
| 业务界面  | 类库  | NET Framework。 | 
| BusinessLogic  | 类库  | NET Framework。 | 
| WebApplication  | ASP.NET Framework Web 应用程序  | NET Framework。 | 
| UnitTests  | NUnit 测试项目  | NET Framework。 | 
| 共享->通用  | 类库  | NET Framework。 | 
| 共享->框架  | 类库  | NET Framework。 | 

**新解决方案：**


| 
| 
| 项目名称 | 项目模板 | 目标架构 | 
| --- |--- |--- |
| BusinessLogic  | 类库  | .NET 5.0  | 
| <WebAPI>  | ASP.NET 核心 Web API  | .NET 5.0  | 
| <WebAPI>。 UnitTests | NUnit 3 测试项目  | .NET 5.0  | 
| 共享->通用  | 类库  | .NET 5.0  | 
| 共享->框架  | 类库  | .NET 5.0  | 