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 的文件夹
- 通过运行以下命令在本地启动 DynamoDB
java -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 日:初版