2014-04-15 58 views
3

我试图通过.Net/C#访问Amazon S3 API上的外部存储桶。Amazon S3 API .Net C# - 访问外部存储桶

我已经尝试登录第三方工具,它的工作就像一个魅力,现在我想要获得框架内的桶的项目。我在Proxy后面使用这个,这就是我使用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); 

我只得到Access denied在抛出Error对象。 我使用的凭据与第三方工具中的100%相同。

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

工作的Python片段是:

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

这将返回正确的结果,所以实际的连接工程,也是凭据。

+0

我有同样的问题,你的服务URL需要HTTP或HTTPS。为我工作。这个文档在其错误的意义上很差。 IMO –

+0

我已经尝试过了,如果我向配置文件的serviceurl中添加http://然后询问listobjects,它实际上询问:http:// bucketnamehttp://s3.amazonaws.com并失败,因为这很明显无效。 – makuro

回答

1

使用给定的答案,作为一个新的研究基地后,我想通了,我得给一个serviceURL中,一个regionendpoint并为S3Config类的一侧communicationprotocol和,因为我知道确切的存储桶中文件的名称,我需要使用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); 
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>(); 
      } 
     } 
    } 
+0

另外,因为它是基于密钥的,所有内容都区分大小写。 –