51

我正在编写代码以将文件上传到 AWS S3 并收到此异常:

AmazonClientException:未配置 RegionEndpoint 或 ServiceURL

我的代码:

Console.WriteLine("ready to upload");
AWSCredentials credentials;
credentials = new BasicAWSCredentials(accessKeyID.Trim(), secretKey.Trim());
AmazonS3Client s3Client = new AmazonS3Client(accessKeyID.Trim(), secretKey.Trim(), Amazon.RegionEndpoint.USEast1);
Console.WriteLine("Successful verification");
Console.WriteLine("Check if the bucket exists");
if (!CheckBucketExists(s3Client, bucketName))
{
    s3Client.PutBucket(bucketName);
    Console.WriteLine("create bucket");
}
TransferUtility utility = new TransferUtility();
Console.WriteLine("Upload  Directory......");
//exception here
utility.UploadDirectory(@"E:\telerikFile\13ginabdfglil.com", bucketName);

例外:

Amazon.Runtime.AmazonClientException: No RegionEndpoint or ServiceURL configured
  Amazon.Runtime.ClientConfig.Validate()
  Amazon.S3.AmazonS3Config.Validate()
  Amazon.Runtime.AmazonServiceClient..ctor(AWSCredentials credentials, ClientConfig config)
  Amazon.S3.AmazonS3Client..ctor()
  Amazon.S3.Transfer.TransferUtility..ctor()
  Telerik2Amazon.Program.UploadFile()

我应该怎么办?

4

8 回答 8

32

错误的简短答案...

Amazon.Runtime.AmazonClientException:未配置 RegionEndpoint 或 ServiceURL

...在我的情况下是在构造客户端对象时指定一个区域(对我来说是AmazonSimpleEmailServiceClient)。

假设你正在使用BasicAWSCredentials然后试试这个:

var credentials = new BasicAWSCredentials(accessKeyID, secretKey);

new AmazonS3Client(credentials, RegionEndpoint.USEast1);

//                              ^^^^^^^^^^^^^^^^^^^^^^  add this
于 2017-09-16T12:48:04.597 回答
9

首先,您不应该对 aws 凭据进行硬编码。

我有一个类似的错误。原来这是由于 .Net Core 的变化:

.NET Core 中最大的变化之一是删除了 ConfigurationManager 以及标准的 app.config 和 web.config 文件

https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-netcore.html

对于快速而肮脏的方法,您可以在您的机器上创建凭证配置文件,请参阅https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html

例如C:\Users\<USERNAME>\.aws\credentials在 Windows 上

[default]
aws_access_key_id = your_access_key_id
aws_secret_access_key = your_secret_access_key

然后在您的代码中,您可以执行以下操作:

var dbClient = new AmazonDynamoDBClient(new StoredProfileAWSCredentials(), 
                     RegionEndpoint.USEast1);

更复杂的方式是:https ://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-netcore.html#net-core-configuration-builder

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();
    Configuration = builder.Build();
}

appsettings.Development.json

{
  "AWS": {
    "Profile": "local-test-profile",
    "Region": "us-west-2"
  }
}


var options = Configuration.GetAWSOptions();
IAmazonS3 client = options.CreateServiceClient<IAmazonS3>();
于 2019-05-04T03:59:21.730 回答
8

在 Asp.Net 中,可以通过将此行添加到 Web.config 来修复此错误:

<add key="AWSRegion" value="us-east-1" />

为我工作 AWSSDK.SimpleEmail v3.3

于 2019-01-21T15:38:09.400 回答
4

我在为使用 S3 客户端的 Lambda 运行测试时收到此错误。我通过简单地提供具有以下区域定义的区域的默认配置文件来解决该错误~/.aws/config

[default]
region = us-west-1

无需更改 Lambda 代码。当然 YMMV 取决于你的情况。

于 2021-06-10T05:56:23.400 回答
2

可以使用我的访问密钥 ID 和密钥。
因此我放弃使用 TransferUtility 类并选择另一个名为 PutObjectRequest 的类来上传我的文件
注意:PutObjectRequest 的属性,它的目录名和文件名必须等于本地文件的目录名和文件名。
这里的代码:

        String s3Path = "987977/Baby.db";
        Console.WriteLine("Ready to upload");
        AWSCredentials credentials;
        credentials = new BasicAWSCredentials(accessKeyID.Trim(), secretKey.Trim());
        AmazonS3Client s3Client = new AmazonS3Client(accessKeyID.Trim(), secretKey.Trim(), Amazon.RegionEndpoint.USEast1);
        Console.WriteLine("Successful verification");
        Console.WriteLine("Check: if the bucket exists");
        if (!CheckBucketExists(s3Client, bucketName))
        {
            s3Client.PutBucket(bucketName);
            Console.WriteLine("Creat bucket");
        }
        string localPath = @"E:\telerikFile\987977\Baby.db";
        PutObjectRequest obj = new PutObjectRequest();
        var fileStream = new FileStream(localPath, FileMode.Open, FileAccess.Read);
  //      obj.FilePath= @"E:\telerikFile\987977\Baby.db";
        obj.InputStream = fileStream;
        obj.BucketName = bucketName;
        obj.Key = s3Path;
       // obj.ContentBody = "This is sample content...";
        obj.CannedACL = S3CannedACL.PublicRead;
        Console.WriteLine("uploading");
        // default to set public right  
        s3Client.PutObject(obj);
于 2017-07-13T12:14:41.417 回答
1

我也有这个问题,没有任何帮助,aws 是最糟糕的,如此复杂,他们的文档低于 microsft,难怪 Azure 正在占据市场份额

于 2021-11-12T16:19:46.880 回答
1

从 .NET Core 开始,不再使用web.configor app.config,而是使用 ConfigurationBuilder,它可以从许多不同的来源检索配置。

.NET 使用的 Web 模板Host.CreateDefaultBuilder(args)依赖于环境变量和appsettings.json文件,对于其他应用程序,可以执行以下操作:

IConfiguration configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile(APPSETTINGS, optional: false, reloadOnChange: true)
                .AddEnvironmentVariables()
                .Build();

这将从appsettings.json文件中检索配置,但也从环境变量中检索配置,并允许您按如下方式检索它们:

var region = configuration["AWS_REGION"];

AWS 开发工具包将使用此配置来检索通过任何 ASP.NET Core 应用程序中的依赖注入检索的服务的区域。对于 Lambda,您需要手动构建一个 ServiceCollection 才能使其工作,这可以这样做。

private readonly ServiceProvider serviceProvider;

public Function()
{
    var serviceCollection = new ServiceCollection();
    serviceCollection.AddSingleton<IAmazonDynamoDB, AmazonDynamoDBClient>();
    serviceProvider = serviceCollection.BuildServiceProvider();
}

public void FunctionHandler(string input, LambdaContext context)
{
    var dynamodb = serviceProvider.GetService<IAmazonDynamoDB>();
    // Business logic here
}

对于几乎所有用例,这种方法应该足够了。如果您对此有疑问,请尝试解决问题,而不是尝试下面的回退。

下一点只是为了完整性,但你真的不需要它。

当使用上述方法失败时,您可以依靠AWSConfigs静态来明确设置您的环境变量。使用下面的方法允许我们重用我们现有的配置,无论是在环境变量中appsettings.json还是在环境变量中。

AWSConfigs.AWSRegion = configuration["AWS_REGION"];
于 2021-08-19T11:47:20.310 回答
0

如果你正在使用TransferUtility()试试这个:

var credentials = new BasicAWSCredentials(accessKeyID, secretKey);

var S3Client = new AmazonS3Client(credentials, RegionEndpoint.USEast1);

this._transferUtility = new TransferUtility(S3Client);
于 2018-08-21T11:41:33.630 回答