通过 Amazon DynamoDB 管理 ASP.NET 会话状态 - Amazon SDK for .NET
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

通过 Amazon DynamoDB 管理 ASP.NET 会话状态

注意

本主题中的信息特定于基于 .NET 框架和Amazon SDK for .NET版本 3.3 及更早版本。

警告

本主题特定于 ASP.NET;本主题中的信息不一定适用于 ASP.NET Core。

ASP.NET 应用程序通常在内存中存储会话状态数据。但是,此方法不能很好地扩展。一旦应用程序的增长超出单个 Web 服务器,就必须在服务器之间共享会话状态。一个常用解决方案就是使用 Microsoft SQL Server 设置专用的会话状态服务器,但该方法同样存在一些缺点:必须管理另一台计算机;会话状态服务器会导致单点故障;并且会话服务器本身也会成为性能瓶颈。

DynamoDB,来自的 NoSQL 数据库存储Amazon提供的解决方案可以在 Web 服务器之间共享会话状态,而且避免了以上缺点。

注意

不论您选择哪种解决方案,请注意 Amazon DynamoDB 对项目大小实施了一些限制。您存储在 DynamoDB 中的任何记录都不能超过该限制。有关更多信息,请参阅 。DynamoDB 中的限制在 Amazon DynamoDB 开发人员指南中。

Amazon SDK for .NET包括 AWS.SessionProvider.dll,其中包含 ASP.NET 会话状态提供程序。它还包括AmazonDynamoDBSessionProviderSample示例演示了如何使用 Amazon DynamoDB 作为会话状态提供程序。

有关针对 ASP.NET 应用程序使用会话状态的更多信息,请转到微软文档.

创建 ASP.NET_SessionState

当您的应用程序启动时,它会查找默认名称为的 Amazon DynamoDB 表。ASP.NET_SessionState. 建议您在首次运行应用程序之前创建该表。

创建 ASP.NET_SessionState 表

  1. 选择 Create Table (创建表)。此时会打开 Create Table 向导。

  2. Table name 文本框中,输入 ASP.NET_SessionState

  3. Primary key 字段中,输入 SessionId 并将类型设置为 String

  4. 根据需要输入所有选项后,选择 Create

当状态从 ASP.NET_SessionState 变为 CREATING 时,ACTIVE 表已可供使用。

注意

如果您决定不预先创建表,则会话状态提供程序将在其初始化期间创建该表。有关用作会话状态表配置参数的属性列表,请参阅以下 web.config 选项。如果由提供程序创建表,它会使用这些参数。

配置会话状态提供程序

配置 ASP.NET 应用程序以使用 DynamoDB 作为会话状态服务器

  1. 将对 AWSSDK.dllAWS.SessionProvider.dll 的引用添加到您的 Visual Studio ASP.NET 项目中。这些组件可以通过NuGet 包或者手动安装程序集.

    在开发工具包的早期版本中,会话状态提供程序的功能包含在 AWS.Extension.dll 中。为了提高可用性,该功能已转移到 AWS.SessionProvider.dll 中。有关更多信息,请参阅博客帖子。AWS.Extension重命名.

  2. 编辑应用程序的 Web.config 文件。在 system.web 元素中,使用以下 XML 片段替换现有 sessionState 元素:

    <sessionState timeout="20" mode="Custom" customProvider="DynamoDBSessionStoreProvider"> <providers> <add name="DynamoDBSessionStoreProvider" type="Amazon.SessionProvider.DynamoDBSessionStateStore" AWSProfileName="{profile_name}" Region="us-west-2" /> </providers> </sessionState>

    配置文件代表Amazon用来与 DynamoDB 通信以存储和检索会话状态的凭证。如果您使用Amazon SDK for .NET并且正在appSettings你的应用程序的部分Web.config文件中,无需在providers部分;Amazon.NET 客户端代码将在运行时搜索它。有关更多信息,请参阅 。配置您的Amazon SDK for .NET应用程序.

    如果 Web 服务器运行在 Amazon EC2 实例上,而该实例配置为使用 EC2 实例的 IAM 角色,则您无需在Web.config文件。在这种情况下,Amazon.NET 客户端将使用 IAM 角色凭证。有关更多信息,请参阅使用 IAM 角色授予访问权限安全注意事项

Web.config 选项

您可以使用 providers 文件的 Web.config 部分中的以下配置属性:

AWSAccessKey

要使用的访问密钥 ID。可以在 providersappSettings 部分中设置。我们建议不要使用此设置,而是使用 AWSProfileName 指定配置文件来指定凭证。

AWSSecretKey

要使用的私有密钥。可以在 providersappSettings 部分中设置。我们建议不要使用此设置,而是使用 AWSProfileName 指定配置文件来指定凭证。

AWSProfileName

与您要使用的凭证关联的配置文件名称。有关更多信息,请参阅 。配置您的Amazon SDK for .NET应用程序.

区域

必需的 string 属性。这些区域有:Amazon使用 Amazon DynamoDB 的区域。查看列表Amazon地区,请参阅区域和终端节点:DynamoDB

应用程序

可选 string 属性。Application 属性的值用于对表中的会话数据进行分区,这样表可以用于多个应用程序。

可选 string 属性。用于存储会话数据的表的名称。默认为 ASP.NET_SessionState

ReadCapacityUnits

可选 int 属性。在提供程序创建表时使用的读取容量单位。默认值为 10。

WriteCapacityUnits

可选 int 属性。在提供程序创建表时使用的写入容量单位。默认 为 5。

CreateIfNotExist

可选 boolean 属性。CreateIfNotExist 属性控制在不存在表的情况下提供程序是否将自动创建表。默认值为 true。如果此标志设置为 false,且表不存在,则会引发异常。

安全考虑因素

创建 DynamoDB 表并配置应用程序之后,会话可以用于任意其他会话提供程序。

作为安全最佳实践,我们推荐您使用 IAM 用户指南用户的凭证运行应用程序。您可以使用IAM 管理控制台或者Amazon Toolkit for Visual Studio以创建 IAM 用户并定义访问策略。

会话状态提供程序需要能够为存储会话数据的表调用 DeleteItemDescribeTableGetItemPutItemUpdateItem 操作。以下示例策略可用于限制 IAM 用户,仅对 us-west-2 中运行的 DynamoDB 实例执行提供程序所需的操作:

{ "Version" : "2012-10-17", "Statement" : [ { "Sid" : "1", "Effect" : "Allow", "Action" : [ "dynamodb:DeleteItem", "dynamodb:DescribeTable", "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:UpdateItem" ], "Resource" : "arn:aws:dynamodb:us-west-2:{<YOUR-AWS-ACCOUNT-ID>}:table/ASP.NET_SessionState" } ] }