

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

# ASP.NET Web Forms 应用程序的高可用性和自动缩放功能 AWS
<a name="ha-scaling"></a>

将旧版 ASP.NET Web Forms 应用程序迁移到时 AWS，实现高可用性是一个关键考虑因素。您可以使用 Amazon A EC2 uto Scaling 组和负载均衡器在多个 EC2 实例之间分配流量。但是，许多 ASP.NET Web Forms 应用程序严重依赖会话状态，这使得它们本质上是有状态的。默认情况下，服务器将生成的会话存储 IDs 在内存中，并通过 Cookie 将 ID 发送回客户端。当您尝试在多个 EC2实例上运行同一个应用程序时，这种方法会出现问题，因为每个实例都会保持自己的会话状态，从而导致用户体验不一致并可能丢失数据。

要解决这一难题并确保迁移的 ASP.NET Web Forms 应用程序能够在保持会话状态的同时跨多个实例无缝扩展，您有两个主要选择：启用粘性会话或使用共享备份存储。

## 为 &ALB 启用粘性会话
<a name="sticky-sessions"></a>

开启 AWS后，您可以将应用程序负载均衡器配置为使用[粘性会话](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/edit-target-group-attributes.html#sticky-sessions)，也称为会*话关联*性。启用粘性会话后，Application Load Balancer 会将来自同一客户端的后续请求路由到同一个 EC2 实例。这样可以确保用户在与应用程序的交互过程中保持其会话状态。

这种方法提供了一种直观的解决方案，但在可扩展性和容错性方面存在局限性。如果 EC2 实例出现故障或不可用，则粘性会话将中断，用户的会话状态将丢失。此外，粘性会话可能会导致实例间的负载分布不均匀，并可能导致资源争用或利用不足，从而限制应用程序有效扩展的能力。出于这些原因，我们建议您改用共享备份存储进行会话存储。

## 使用共享备份存储进行会话存储
<a name="backing-store"></a>

将有状态的 ASP.NET Web Forms 应用程序迁移到的推荐方法 AWS 是使用共享备份存储进行会话存储。该应用程序可以将会话数据存储在高度可用且可扩展的存储解决方案中，例如[亚马逊 DynamoDB、适用于 SQL Server 的亚马逊](https://github.com/aws/aws-dotnet-session-provider/)[关系数据库服务 (Amazon RDS) [或 ElastiCache 亚马](https://aws.amazon.com/blogs/developer/elasticache-as-an-asp-net-session-store/)逊 (Redis OSS)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_SQLServer.html)，而不是依赖单个 EC2 实例的内存会话状态。

使用共享备份存储时，可以将会话状态与单个 EC2实例分离，这样应用程序就可以在多个实例之间无缝扩展，而不会丢失会话数据。这种方法还可以提高容错能力，因为会话数据独立于应用程序实例，从而确保即使实例出现故障或在扩展事件期间，用户会话也不会丢失。

要将 ASP.NET Web Forms 应用程序配置为使用 Redis 作为会话存储的共享后备存储，请执行以下操作：

1. 为集群创建新的安全组。安全组必须允许向使用 TCP 端口 6379 的 Redis 发出的入站请求。

1. 启动一个新的 Redis 集群。请务必指定您在第一步中创建的安全组。

1. 获取您刚刚创建的实例的终端节点地址。在地址变为可用之前，您必须等待几分钟才能启动集群。

1. 修改`web.config`文件并添加以下配置：

   ```
   <sessionState mode="Custom" customProvider="RedisStateStore">
     <providers>
       <add name="RedisStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider"
            host="[YourRedisClusterEndpoint]"
            accessKey=""
            ssl="true" />
     </providers>
   </sessionState>
   ```

   `[YourRedisClusterEndpoint]`替换为您的 ElastiCache (Redis OSS) 集群的相应值。

通过为会话存储实现共享备份存储，您可以为迁移的 ASP.NET Web Forms 应用程序提供高可用性、可扩展性和容错功能。 AWS这种方法符合云原生最佳实践，即使您的应用程序跨多个 EC2 实例或可用区域进行扩展，也可确保无缝的用户体验。此外，它提供了比粘性会话更强大、更可靠的解决方案，并使您的应用程序能够充分利用 AWS 基础架构提供的可扩展性和弹性。