ASP.NET Core Web API + DynamoDB 本地运行
如何使用 ASP.NET Core Web API 在本地访问 DynamoDB
引言
我想为我的 [博客](https://blogs.roarcoder.dev) 创建一个评论系统,而不是使用现有的系统,以便学习它是如何构建的。这是我朋友 Paul 的主意。
我需要一个数据库来存储和管理所有评论。因此,我选择了 DynamoDB。我选择使用 C# 在 Lambda 中创建 API。所有这些都通过 AWS Serverless Application Model (SAM) 完成。
内容涵盖
- 创建 ASP.NET Core Web API
- 集成 Swagger UI
- 在本地连接和读取 DynamoDB
必备组件
创建项目
- 打开终端
- 检查安装的 dotnet 版本dotnet --version 
- 安装 Lambda 和 serverless 模板dotnet new -i Amazon.Lambda.Templates 
- 使用上面安装的模板创建 ASP.NET Core Web API
 dotnet new serverless.AspNetCoreWebAPI --name CommentsAPI
- 进入 `src` 目录,然后进入项目的文件夹cd src cd CommentsAPI 
- 恢复所有依赖项dotnet restore 
- 运行项目以确保它能正常工作,没有错误dotnet run 
- 使用 VS Code 或您喜欢的任何文本编辑器打开项目文件夹
- 注意到除了标准的 .NET 项目创建区域之外,还有四个新文件。

- aws-lambda-tools-defaults.json - 此文件由 lambda 工具默认读取。您的函数处理程序在此文件中指定。因此,如果您更改了函数名称,也需要在此文件中更新。
- LambdaEntryPoint- 当您部署到 AWS 时,这个文件几乎是自解释的(lambda 执行您的应用程序代码的文件)。
- LocalEntryProint- 在本地测试应用程序时的本地测试入口点。
- serverless.template- SAM 模板文件,以 JSON 格式定义基础设施即代码。
集成 Swagger
- 我们将使用 Swagger 来记录我们的 Web API 并在浏览器中进行测试。添加 Swagger 的 NuGet 包
 dotnet add package Swashbuckle.AspNetCore
- 要使用它,您需要通过在 `Startup.cs` 文件中的 `ConfigureServices` 方法中添加以下代码来注册它services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "Comments API", Version = "v1" }); });
- 在页面顶部添加 `Microsoft.OpenApi.Models` 的导入using Microsoft.OpenApi.Models; 
- 然后,通过在 Startup.cs 文件的 `Configure` 方法中插入以下代码来启用它。在 `app.UseHttpsRedirection();` 之前添加以下代码。否则,Swagger UI 将无法加载。app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("v1/swagger.json", "Comments"); c.RoutePrefix = "swagger"; });
- 运行应用程序,然后点击显示的 URL
- 将 URL 中的 index.html 替换为 swagger,然后按 **Enter**
- 如果一切顺利,您现在应该会看到 Swagger UI
安装、连接和读取本地 DynamoDB
要连接和读取 DynamoDB,我们首先需要将其安装在本地。
安装 DynamoDB 本地版
请在此处按照步骤操作 。
创建表
- 导航到解压 DynamoDBLocal.jar 的文件夹
- 通过运行以下命令在本地启动 DynamoDBjava -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb  
- 打开另一个终端选项卡。
- 运行以下命令创建表aws dynamodb create-table --table-name commentsTable --attribute-definitions AttributeName=id,AttributeType=S --key-schema AttributeName=id,KeyType=HASH --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 --endpoint-url=https://:8000 上面的命令在终端 `https://:8000` 创建了一个名为 commentsTable的表。
- 要检查创建的表,请运行aws dynamodb list-tables --endpoint-url https://:8000 
将 ASP.NET Core Web API 连接到本地 DynamoDB
- 导航到您的项目文件夹。我们将添加两个 NuGet 包。它们对于与 DynamoDB 建立连接至关重要dotnet add package AWSSDK.DynamoDBv2 dotnet add package AWSSDK.Extensions.NETCore.Setup AWSSDK.DynamoDBv2- 添加了足够的支持,可以使用 AWS .NET SDK 与 DynamoDB 进行交互AWSSDK.Extensions.NETCore.Setup- 包含通过依赖注入配置和注册 AWS 服务的相关方法。
- 现在将配置添加到 appsettings.json。它包含本地 DynamoDB 的配置。"DynamoDb": { "LocalMode": true, "LocalServiceUrl": "https://:8000" }现在您的 appsettings.json 应该如下所示:  在上面的代码中,我们为 DynamoDB 服务创建了配置,并将模式设置为 local。然后,我们将服务 URL 设置为 localhost,端口设置为8000以便在本地运行。
- 现在我们需要注册 Dynamo 服务。在 Startup.cs 文件中,在 `ConfigureServices` 方法中添加以下代码var dynamoDbConfig = Configuration.GetSection("DynamoDb"); var runLocalDynamoDb = dynamoDbConfig.GetValue<bool>("LocalMode"); services.AddSingleton<IAmazonDynamoDB>(sp => { var clientConfig = new AmazonDynamoDBConfig { ServiceURL = dynamoDbConfig.GetValue<string>("LocalServiceUrl") }; return new AmazonDynamoDBClient(clientConfig); });
代码解释
- var dynamoDbConfig = Configuration.GetSection("DynamoDb");- 从配置文件中获取- DynamoDb部分
- var runLocalDynamoDb = dynamoDbConfig.GetValue<bool>("LocalMode");- 获取本地模式的值
- services.AddSingleton<IAmazonDynamoDB>- 注册一个服务- IAmazonDynamoDB接口,该接口返回实际的实现。
- var clientConfig- = new AmazonDynamoDBConfig { ServiceURL = dynamoDbConfig.GetValue<string>("LocalServiceUrl") };- 创建一个- AmazonDynamoDBConfig实例,传入 appsetting.json 中的- LocalServiceURL。
- return new AmazonDynamoDBClient(clientConfig);- 使用配置返回- AmazonDynamoDBClient。
从 DynamoDB 本地版读取
在我们的应用程序中注册 IAmazonDynamoDB 后,我们现在可以通过 Microsoft 依赖注入将其插入到我们的 Controller 中。
- 删除 controllers 文件夹中的两个控制器:S3ProxyController和ValuesController。
- 右键单击 Controllers 文件夹 > **新建 C# 类**
- 将类命名为 CommentsController
- 确保该类派生自 ControllerBase
- 在 `class` 关键字上方添加以下行[Route("getcomments")] [ApiController]
代码解释
[Route("getcomments")] - 注释此控制器可以访问的路由
[ApiController] - 表明这是一个控制器
- 添加以下代码private const string TableName = "commentsTable"; private readonly IAmazonDynamoDB _amazonDynamoDb; public CommentsController(IAmazonDynamoDB amazonDynammoDb) { _amazonDynamoDb = amazonDynammoDb; } [HttpGet("{id}")] public async Task<ActionResult<string>> Get(int id) { var request = new GetItemRequest { TableName = TableName, Key = new Dictionary<string, AttributeValue> { { "id", new AttributeValue { S = id.ToString() } } } }; var response = await _amazonDynamoDb.GetItemAsync(request); return response.Item["username"].S; }
- 现在通过运行以下命令在 DynamoDB 中插入一条记录aws dynamodb put-item --table-name commentsTable --item '{"id": {"S": "1"},"username": {"S": "zain"}}' --endpoint-url https://:8000
- 要检查记录是否已插入,请使用以下命令扫描表aws dynamodb scan --table-name commentsTable --endpoint-url https://:8000 
- 您应该会看到类似以下的响应 
- 现在通过在项目文件夹中运行 dotnet run来运行应用程序。
- 点击 URL。
- 将 index.html 替换为 swagger后,您应该会看到以下页面
您只看到 GET 请求,因为我们在 Controller 中只实现了该方法。
- 点击蓝色的 **GET** 按钮。
- 点击 **Try It Out**。
- 在 **id** 文本框中输入 1。
- 点击 **Execute**。
- 您应该会在 **Responses** 部分看到响应。
您终于成功了。恭喜!!!!请继续关注其他方法。
历史
- 2020 年 7 月 7 日:初版


