通过c# SDK在S3上上传桶名包含点号(点)时出错

本文关键字:出错 包含点 SDK S3 通过 | 更新日期: 2023-09-27 18:16:56

我在S3上创建了两个bucket,分别命名为"demobucket"answers"demo.bucket"。当我在"demobucket"上上传任何文件时,它工作得很好。但是当我上传文件到demo。,它给我一个错误"最大重试次数达到:3"

我关心的是,当桶名包含句号(点)时,上传文件会出现什么问题。

我的代码是:
public static bool UploadResumeFileToS3(string uploadAsFileName, Stream ImageStream, S3CannedACL filePermission, S3StorageClass storageType)
    {
        try
        {
            AmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(MY_AWS_ACCESS_KEY_ID, MY_AWS_SECRET_KEY);
PutObjectRequest request = new PutObjectRequest();
            request.WithKey(uploadAsFileName);
            request.WithInputStream(ImageStream);
            request.WithBucketName("demo.bucket");
            request.CannedACL = filePermission;
            request.StorageClass = storageType;
            client.PutObject(request);
            client.Dispose();
        }
        catch
        {
            return false;
        }
        return true;
    }

通过c# SDK在S3上上传桶名包含点号(点)时出错

当桶名包含句号时,建立到S3的安全连接出现问题。这个问题在这里解释得很好:http://shlomoswidler.com/2009/08/amazon-s3-gotcha-using-virtual-host.html.

一个解决方案是创建S3客户端,传递第三个参数,使其使用HTTP而不是HTTPS。查看Amazon S3 c# SDK"底层连接已关闭:无法为SSL/TLS安全通道建立信任关系";错误。

    AmazonS3Config S3Config = new AmazonS3Config()
    {
        ServiceURL = "s3.amazonaws.com",
        CommunicationProtocol = Protocol.HTTP,
        RegionEndpoint = region
    };

但是,请注意,这是不安全的,亚马逊不建议这样做。你的密匙可能会被截获。我还没有找到一种安全的方法来将文件上传到名称中带有句点的桶。

如果您使用的是最新版本的AWSSDK.dll(至少2.0.13.0),您可以这样做:

    AmazonS3Config S3Config = new AmazonS3Config()
    {
        ServiceURL = "s3.amazonaws.com",
        ForcePathStyle = true,
        RegionEndpoint = region
    };

这将强制S3Client使用桶路径的版本,从而避免了这个问题。