创建无服务器的ASP.NET Core Web API与DynamoDB集成

在这个教程中,将学习如何创建一个使用ASP.NET Core的无服务器Web API,并将其与DynamoDB数据库集成。这个过程包括了使用AWS Serverless Application Model (SAM),以及如何本地测试和部署到AWS云服务。这个项目最初是由朋友Paul提出的,目的是为了学习如何构建一个完整的后端服务。

涵盖内容

将创建一个ASP.NET Core Web API,集成Swagger UI以便于文档生成和API测试,以及如何从本地连接和读取DynamoDB数据库。

先决条件

在开始之前,请确保已经拥有以下条件:

  • 一个AWS账户
  • C# 语言知识
  • .NET Core SDK和运行时环境
  • Java环境
  • .NET CLI
如果还没有安装上述环境,请从提供的链接下载并安装。

创建项目

打开终端,检查已安装的.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项目文件外,还创建了四个新文件:

  • aws-lambda-tools-defaults.json - Lambda工具默认读取此文件。如果更新了函数的名称,也需要在此文件中更新。
  • LambdaEntryPoint - Lambda执行应用程序代码的入口文件。
  • LocalEntryPoint - 本地测试应用程序时的入口点。
  • serverless.template - 定义基础设施即代码的SAM模板文件。

集成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" }); }); 在页面顶部添加导入: 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

要连接并读取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 应该看到类似于这样的响应:

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485