65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET Core Web API + DynamoDB 本地运行

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2020年7月7日

CPOL

4分钟阅读

viewsIcon

22957

如何使用 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

必备组件

  • AWS 账户
  • C#
  • 已安装 .NET Core SDKRuntime(如果还没有,请从提供的链接安装)
  • 已安装 Java
  • .NET CLI

创建项目

  1. 打开终端
  2. 检查安装的 dotnet 版本
    dotnet --version
  3. 安装 Lambda 和 serverless 模板
    dotnet new -i Amazon.Lambda.Templates
  4. 使用上面安装的模板创建 ASP.NET Core Web API
    dotnet new serverless.AspNetCoreWebAPI --name CommentsAPI
  5. 进入 `src` 目录,然后进入项目的文件夹
    cd src
    cd CommentsAPI
  6. 恢复所有依赖项
    dotnet restore
  7. 运行项目以确保它能正常工作,没有错误
    dotnet run
  8. 使用 VS Code 或您喜欢的任何文本编辑器打开项目文件夹
  9. 注意到除了标准的 .NET 项目创建区域之外,还有四个新文件。

  • aws-lambda-tools-defaults.json - 此文件由 lambda 工具默认读取。您的函数处理程序在此文件中指定。因此,如果您更改了函数名称,也需要在此文件中更新。
  • LambdaEntryPoint - 当您部署到 AWS 时,这个文件几乎是自解释的(lambda 执行您的应用程序代码的文件)。
  • LocalEntryProint - 在本地测试应用程序时的本地测试入口点。
  • serverless.template - SAM 模板文件,以 JSON 格式定义基础设施即代码。

集成 Swagger

  1. 我们将使用 Swagger 来记录我们的 Web API 并在浏览器中进行测试。添加 Swagger 的 NuGet 包
    dotnet add package Swashbuckle.AspNetCore
  2. 要使用它,您需要通过在 `Startup.cs` 文件中的 `ConfigureServices` 方法中添加以下代码来注册它
    services.AddSwaggerGen(c => {
      c.SwaggerDoc("v1", new OpenApiInfo { Title = "Comments API", Version = "v1" });
    });
  3. 在页面顶部添加 `Microsoft.OpenApi.Models` 的导入
    using Microsoft.OpenApi.Models;
  4. 然后,通过在 Startup.cs 文件的 `Configure` 方法中插入以下代码来启用它。在 `app.UseHttpsRedirection();` 之前添加以下代码。否则,Swagger UI 将无法加载。
    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
      c.SwaggerEndpoint("v1/swagger.json", "Comments");
      c.RoutePrefix = "swagger";
    });
  5. 运行应用程序,然后点击显示的 URL
  6. 将 URL 中的 index.html 替换为 swagger,然后按 **Enter**
  7. 如果一切顺利,您现在应该会看到 Swagger UI

安装、连接和读取本地 DynamoDB

要连接和读取 DynamoDB,我们首先需要将其安装在本地。

安装 DynamoDB 本地版

请在此处按照步骤操作

创建表

  1. 导航到解压 DynamoDBLocal.jar 的文件夹
  2. 通过运行以下命令在本地启动 DynamoDB
    java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb

  3. 打开另一个终端选项卡。
  4. 运行以下命令创建表
    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 的表。

  5. 要检查创建的表,请运行
    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 文件夹中的两个控制器:S3ProxyControllerValuesController
  • 右键单击 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 日:初版
© . All rights reserved.