

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

# 支持对静态 .NET Framework 应用程序进行动态扩展
<a name="net-static"></a>

## 概述
<a name="net-static-overview"></a>

将云用于应用程序的一大关键优势在于其弹性，即可以根据需求灵活地横向扩展或缩减计算资源的使用量。这使得您只需为实际所需的计算容量付费，而无需为峰值使用量进行预调配。“网络星期一”是一个很好的例子，说明了弹性经济的概念。在这个特殊日子里，线上零售商能够获得比平时高出数倍甚至更多的流量（例如，[短短几分钟内达到数千个百分点的增幅](https://aws.amazon.com/blogs/startups/how-clicktale-uses-aws-to-power-a-successful-cyber-monday/)）。

如果您要将遗留的 .NET Web 应用程序迁移到云中（例如，在 IIS 上运行的 ASP.NET Framework 应用程序），由于应用程序的有状态特性，可能难以或无法快速扩展负载均衡的服务器场。用户会话数据存储在应用程序的内存中，通常与保留必须持久保存的跨请求数据的 [ASP.NET 会话状态](https://learn.microsoft.com/en-us/previous-versions/aspnet/ms178581(v=vs.100))或静态变量一起存储。用户会话亲和性通常通过负载均衡器的粘性会话来保持。

事实证明，这在操作上具有挑战性。当需要增加容量时，您必须有意预调配并添加服务器。这可能是一个缓慢的过程。在进行补丁安装或出现意外故障时，若要将节点停用，可能会对最终用户体验造成影响，从而使所有与受影响节点相关联的用户都将丢失状态。最理想的情况是，这只需要用户再次登录即可。

通过为 ASP.NET 应用程序集中管理会话状态，并对遗留的 ASP.NET 应用程序应用自动扩展规则，您可以充分利用云的弹性，并在运行应用程序时可能节省成本。例如，通过计算资源可扩展性，您可以降低成本，同时您还可以选择不同的定价模式，比如减少[预留实例的使用量](https://aws.amazon.com/ec2/pricing/reserved-instances/)并采用 [Amazon 竞价型实例定价](https://aws.amazon.com/ec2/spot/)。

两种常见的技术包括使用[亚马逊 DynamoDB 作为会话状态提供](https://github.com/aws/aws-dotnet-session-provider)程序和使用[ ElastiCache 亚马逊（Redis OSS）作为 ASP.NE](https://aws.amazon.com/blogs/developer/elasticache-as-an-asp-net-session-store/) T 会话存储。

下图显示了将 DynamoDB 用作会话状态提供者的架构。



![\[DynamoDB 作为会话状态提供者\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/optimize-costs-microsoft-workloads/images/session_state_dynamodb.png)


下图显示了使用 ElastiCache (Redis OSS) 作为会话状态提供程序的架构。



![\[ElastiCache (Redis OSS) 作为会话状态提供者\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/optimize-costs-microsoft-workloads/images/session_state_elasticache.png)


## 成本影响
<a name="net-static-cost"></a>

要确定扩展为生产应用程序带来的益处，我们建议您对实际需求进行建模。本部分基于以下假设来构建一个示例应用程序模型：
+ 添加和从旋转操作中移除的实例是完全相同的，并且不会带来实例大小的变化。
+ 服务器的利用率始终不会低于两台活动服务器，以维持应用程序的高可用性。
+ 服务器的数量会与流量呈线性关系扩展（也就是说，流量增加一倍，所需的计算能力也会增加一倍）。
+ 以六小时为增量对一个月的流量进行建模，其中包含日内差异以及一天中出现的一次异常的流量高峰（例如，促销活动期间的流量会达到平时的 10 倍）。基于基础利用率对周末流量进行建模。
+ 夜间流量按照基础利用率进行建模，而工作日的流量则按照 4 倍的利用率进行建模。
+ 预留实例定价采用为期一年的无预付定价。普通的日间定价采用按需定价模式，而爆发需求则采用竞价型实例定价模式。

下图说明了此模型如何在 .NET 应用程序中充分利用弹性特性，而非为峰值使用量进行预调配。这样可以节省大约 68% 的成本。



![\[自动扩缩成本图表\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/optimize-costs-microsoft-workloads/images/graph_autoscaling_costs.png)


如果您使用 DynamoDB 作为会话状态存储机制，请使用以下参数：

```
Storage: 20GB
Session Reads: 40 million
Session Writes: 20 million
Pricing Model: On demand
```

这项服务的每月预计费用约为 35.00 美元。

如果您使用 ElastiCache (Redis OSS) 作为会话状态存储机制，请使用以下参数：

```
Number of Nodes: 3
Node size: cache.t4g.medium
Pricing Model: 1y reserved
```

这项服务的每月预计费用约为 91.00 美元。

## 成本优化建议
<a name="net-static-rec"></a>

第一步是在遗留的 .NET 应用程序中实施会话状态管理。如果您使用 ElastiCache 作为状态存储机制，请按照 AWS 开发者工具博客中[ElastiCache 作为 ASP.NET 会话存储](https://aws.amazon.com/blogs/developer/elasticache-as-an-asp-net-session-store/)中的指导进行操作。如果您使用的是 DynamoDB，请按照文档中的[内容中的](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/welcome.html)指导进行操作 适用于 .NET 的 AWS SDK。 适用于 .NET 的 SDK 

如果应用程序一开始就使用**InProc**会话，请确保计划存储在会话中的所有对象都可以序列化。为执行此操作，请使用 `SerializableAttribute` 属性来修饰那些实例将被存储在会话中的类。例如：

```
[Serializable()] 
public class TestSimpleObject { 
public string SessionProperty {get;set;}
}
```

此外，所有正在使用的服务器上的 .NET `MachineKey` 必须保持一致。通常情况下，如果实例是基于通用的亚马逊机器映像（AMI）创建的，就会出现这种情况。例如：

```
<machineKey
validationKey="some long hashed value"
decryptionKey="another long hashed value"
validation="SHA1"/>
```

然而，重要的是确保在更改基础映像时，其配置应与相同的 .NET 机器映像保持一致（这种配置可以在 IIS 或服务器级别进行设置）。有关更多信息，请参阅[SystemWebSectionGroup。 MachineKey 微软文档中的属性](https://learn.microsoft.com/en-us/dotnet/api/system.web.configuration.systemwebsectiongroup.machinekey?view=netframework-4.8.1)。

最后，您必须确定在响应扩展事件时向自动扩缩组添加服务器的机制。我们可以通过多种方式来完成此操作。我们建议使用以下方法将 .NET Framework 应用程序无缝部署到自动扩缩组中的 EC2 实例中：
+ 使用 [EC2 Image Builder](https://aws.amazon.com/image-builder/) 配置包含完全配置的服务器和应用程序的 AMI。然后，您可以使用此 AMI 来配置[自动扩缩组的启动模板](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-asg-launch-template.html)。
+ [AWS CodeDeploy](https://aws.amazon.com/codedeploy/)用于部署您的应用程序。 CodeDeploy 允许直接与 [Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/codedeploy/latest/userguide/integrations-aws-auto-scaling.html) 集成。这为针对应用程序的每个版本创建新 AMI 提供了另一种选择。

## 其他资源
<a name="net-static-resources"></a>
+ [使用 EC2 Image Builder 创建映像](https://docs.aws.amazon.com/imagebuilder/latest/userguide/create-images.html)（EC2 Image Builder 文档）
+ [使用 AWS CodeDeploy Visual Studio 团队服务部署.NET Web 应用程序](https://aws.amazon.com/blogs/developer/deploying-net-web-applications-using-aws-codedeploy-with-visual-studio-team-services/)（AWS 开发者工具博客）