【问题标题】:Amazon S3 API .Net C# - Accessing external BucketAmazon S3 API .Net C# - 访问外部存储桶
【发布时间】:2014-04-15 14:45:39
【问题描述】:

我正在尝试通过 .Net / C# 通过 Amazon S3 API 访问外部存储桶。

我已经尝试过使用 3rd 方工具登录,它就像一个魅力,现在我想在框架内获取存储桶中的项目。我在代理后面使用它,这就是我使用 S3config 的原因。

AmazonS3Config S3Config = new AmazonS3Config()
                        {
                            CommunicationProtocol = Protocol.HTTP,
                            ProxyHost = Proxy.Host,
                            ProxyPort = Convert.ToInt32(Proxy.Port),
                            ProxyCredentials = new NetworkCredential
                                                {
                                                    UserName = Proxy.User,
                                                    Password = Proxy.Password
                                                }
                        };
AmazonS3 S3Client = Amazon.AWSClientFactory.CreateAmazonS3Client(AccessKey, SecretKey,S3Config);

这就是我与亚马逊建立连接的方式。我也已经试过放置

ServiceURL = "s3.amazonaws.com",

进入配置对象初始化程序,因为我在欧盟并且存储桶位于美国的某个地方。

当我现在尝试通过以下方式访问时:

ListObjectsRequest req = new ListObjectsRequest { BucketName = "yelp-syndication" };
ListObjectsResponse resp = S3Client.ListObjects(req);

AmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKeyID, secretAccessKeyID);
return client.ListBuckets().Buckets.Where(b => b.BucketName == bucket).Single();

ListObjectsRequest Request = new ListObjectsRequest
                            {
                            BucketName = BucketName
                            };
ListObjectsResponse Response = S3Client.ListObjects(Request);

我只在抛出的错误对象中得到拒绝访问。 我使用的凭据与 3rd 方工具中的凭据 100% 相同。

我在这里遗漏了什么吗?我是否需要使用任何我找不到的特殊方法来使其工作?

一个工作的 python sn-p 是:

from boto.s3.connection import S3Connection
 conn = S3Connection(<ACCESS_KEY_ID>, <SECRET_ACCESS_KEY)
 bucket = conn.get_bucket(<BucketName>, validate=False)

这会返回正确的结果,因此实际连接和凭据都有效。

【问题讨论】:

  • 我遇到了同样的问题,你的服务 url 需要 http 或 https。为我工作。从错误的意义上说,文档很差。海事组织
  • 我已经尝试过了,如果我将 http:// 添加到配置的 serviceurl 然后询问 listobjects,它实际上要求:bucketnamehttp://s3.amazonaws.com 并且失败了,因为这显然是无效的。

标签: c# amazon-web-services amazon-s3


【解决方案1】:

这是我用来返回存储桶中“目录”中的文件列表的代码,我知道它肯定有效。我说的是目录,但实际上没有这样的东西。我对 S3 的理解是每个文件/文件夹都是一个对象。每个对象都有一个键。键确定您将在树中的哪个位置看到文件夹或文件。我相信一个关键的 Folder1 将是一个名为 Folder1 的文件夹。具有键 Folder1/File1.txt 的对象将是 Folder1 中的一个文件。

如果其他聪明人有更多话要说或更正,我相信他们会告诉我的。但是,代码确实有效。

    public List<string> ListFilesIn(string folder)
    {
        //I get my values from Orchard CMS but as long as your credentials are correct and can access the bucket this should work a dream.
        var settings = new {S3ServiceUrl = "", S3SecretKey="", S3KeyId = "", S3BucketName = ""}

        var amazonS3Config = new AmazonS3Config
        {
            ServiceURL = string.Format("https://{0}", settings.S3ServiceUrl)
        };

        folder += folder.Substring(folder.Length - 1, 1) == "/" ? "" : "/";

        using (var amazonS3Client = new AmazonS3Client(settings.S3KeyId,
         settings.S3SecretKey,
         amazonS3Config))
        {

            var response = amazonS3Client.ListObjects(new ListObjectsRequest
            {
                BucketName = settings.S3BucketName,
                Prefix = folder
            });

            if (response.S3Objects.Count() > 0)
            {
                return response.S3Objects.Select(s => s.Key).Where(w=>w != folder).ToList();
            }
            else
            {
                return new List<string>();
            }
        }
    }

【讨论】:

  • 另外,因为它是基于密钥的,所以一切都区分大小写。
【解决方案2】:

在使用给定的答案作为研究的新基础后,我发现,一方面我必须为 S3Config 类提供 serviceurl、regionendpoint 和通信协议,因为我知道文件的确切名称在存储桶中,我需要使用 getobject 而不是对存储桶的访问。

所以让我工作的代码是:

            AmazonS3Config S3Config = new AmazonS3Config
                                  {
                                      ServiceURL = "s3.amazonaws.com",
                                      RegionEndpoint = RegionEndpoint.USWest2,
                                      CommunicationProtocol = Protocol.HTTPS,
                                      ProxyHost = Proxy.Host,
                                      ProxyPort = Convert.ToInt32(Proxy.Port),
                                      ProxyCredentials = new NetworkCredential
                                                         {
                                                             UserName = Proxy.User,
                                                             Password = Proxy.Password
                                                         }
                                  };
        _S3Client = AWSClientFactory.CreateAmazonS3Client(AccessKey, SecretKey, S3Config);
        _ObjRequest = new GetObjectRequest
                                      {
                                          BucketName = BucketName,
                                          Key = Key
                                      };
        _ObjResponse = _S3Client.GetObject(_ObjRequest);
        return (_ObjResponse != null);

【讨论】:

    猜你喜欢
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 2014-12-03
    • 2016-01-22
    相关资源
    最近更新 更多