AWS .NET SDK 使用 ASP.NET Core 依赖注入配置 S3 客户端

Gre*_*uff 4 c# amazon-s3 amazon-web-services asp.net-core

工具

  • Visual Studio 2017 专业版
  • .NET Core SDK v2.2.102
  • AWSSDK.S3 v3.3.102.14

我想做什么

为使用 localstack 端点作为 S3 的 ServiceURL 的开发环境配置 Amazon S3 客户端

我正在尝试Startup.cs使用 ASP.NET Core 的本机依赖注入在我的文件中全局配置 S3 客户端

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddAWSService<IAmazonS3>();
}
Run Code Online (Sandbox Code Playgroud)

问题

我不知道如何为 S3 客户端设置 ServiceURL。我在AWS 文档中看到您可以在appsettings.json文件中配置此属性。但是,这并不能解决我的问题,因为我需要集成多个 AWS 服务。

我在谷歌上搜索的所有内容都表明你只需要做这样的事情:

var s3Client = new AmazonS3Client(new AmazonS3Config
{
    ServiceURL = "http://localhost:5002"
});
Run Code Online (Sandbox Code Playgroud)

但是我必须在使用 S3 客户端的每个类中都这样做,这似乎不正确。

任何帮助表示赞赏。谢谢

Ray*_*lli 7

您可以添加包引用AWSSDK.Extensions.NETCore.Setup。这使您可以访问一些扩展方法来帮助您在 .NET Core DI 中设置 AWS 服务。

services.AddDefaultAWSOptions(config.GetAWSOptions());
services.AddAWSService<IAmazonS3>();
services.AddAWSService<IAmazonSQS>();
Run Code Online (Sandbox Code Playgroud)

然后,您可以在启用服务的情况下启动 LocalStackedge并设置PORT_EDGE_HTTP环境变量。

PORT_EDGE_HTTP=50234 SERVICES=edge,s3,sqs localstack start
Run Code Online (Sandbox Code Playgroud)

这允许您对 LocalStack 提供的所有服务使用相同的内容,ServiceURL而不是在其自己的端口上运行的各种特定于服务的 URL。这可以通过设置appsettings.json。

{
    "AWS": {
        "ServiceURL": "http://localhost:50234"
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:我仍在试图弄清楚的一件事是如何设置ForcePathStylevia appsettings.json。AWS 不需要这个集合,但显然 LocalStack 需要(至少现在是这样)。


Gre*_*uff 5

好吧,我想我想通了这一点。

而不是使用内置的 ASP.NET Core DI:

services.AddAWSService<IAmazonS3>();
Run Code Online (Sandbox Code Playgroud)

我正在像这样使用 Autofac(文档):

var s3Config = new AmazonS3Config
{
    ServiceURL = _configuration.GetSection("AWS:ServiceURL").Value,
    ForcePathStyle = true
};

builder.RegisterType<AmazonS3Client>()
    .As<IAmazonS3>()
    .WithParameter(new TypedParameter(typeof(AmazonS3Config), s3Config))
    .InstancePerLifetimeScope();
Run Code Online (Sandbox Code Playgroud)