在这个教程中,将学习如何创建一个使用ASP.NET Core的无服务器Web API,并将其与DynamoDB数据库集成。这个过程包括了使用AWS Serverless Application Model (SAM),以及如何本地测试和部署到AWS云服务。这个项目最初是由朋友Paul提出的,目的是为了学习如何构建一个完整的后端服务。
将创建一个ASP.NET Core Web API,集成Swagger UI以便于文档生成和API测试,以及如何从本地连接和读取DynamoDB数据库。
在开始之前,请确保已经拥有以下条件:
打开终端,检查已安装的.NET版本:
dotnet --version
安装Lambda和无服务器模板:
dotnet new -i Amazon.Lambda.Templates
使用上述安装的模板创建ASP.NET Core Web API:
dotnet new serverless.AspNetCoreWebAPI --name CommentsAPI
进入项目文件夹:
cd src
cd CommentsAPI
恢复所有依赖项:
dotnet restore
运行项目以确保没有错误:
dotnet run
使用VS Code或最喜欢的文本编辑器打开项目文件夹。
会注意到除了常规的.NET项目文件外,还创建了四个新文件:
将使用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" });
});
在页面顶部添加导入:
using Microsoft.OpenApi.Models;
然后在Startup.cs文件的Configure方法中启用它:
app.UseSwagger();
app.UseSwaggerUI(c => {
c.SwaggerEndpoint("v1/swagger.json", "Comments");
c.RoutePrefix = "swagger";
});
运行应用程序,然后点击显示的URL。如果一切顺利,现在应该可以看到Swagger UI了。
要连接并读取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=http://localhost:8000
上述命令在http://localhost:8000端点创建了一个名为commentsTable的表。
要检查创建的表,运行:
aws dynamodb list-tables --endpoint-url http://localhost:8000
导航到项目文件夹。将添加两个NuGet包。这些对于连接到DynamoDB至关重要:
dotnet add packageAWSSDK.DynamoDBv2
dotnet add packageAWSSDK.Extensions.NETCore.Setup
AWSSDK.DynamoDBv2 - 使用AWS .NET SDK与DynamoDB交互的足够支持。
AWSSDK.Extensions.NETCore.Setup - 包含配置和注册AWS服务与依赖注入的方法。
现在在appsettings.json中添加配置。这包含本地DynamoDB的配置。
{
"DynamoDb": {
"LocalMode": true,
"LocalServiceUrl": "http://localhost:8000"
}
}
现在appsettings.json应该看起来像这样:
在上述代码中,为DynamoDB服务创建了配置,并将模式设置为本地。然后,将服务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。
在应用程序中注册IAmazonDynamoDB后,现在可以使用Microsoft依赖注入在Controller中插入它。
删除controllers文件夹中的两个控制器S3ProxyController和ValuesController。
右键点击Controllers文件夹 > 新建C#类,将类命名为CommentsController。确保该类派生自ControllerBase,并在类关键字上方添加以下行:
[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
现在通过运行以下命令在DynamoDB中插入一条记录:
aws dynamodb put-item --table-name commentsTable --item '{"id": {"S": "1"},"username": {"S": "zain"}}' --endpoint-url http://localhost:8000
要检查记录是否已插入,请使用以下命令扫描表:
aws dynamodb scan --table-name commentsTable --endpoint-url http://localhost:8000
应该看到类似于这样的响应: