c# - Amazon S3 API .Net C# - 访问外部存储桶

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

我正在尝试通过 .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);

我只在抛出的错误对象中得到 Access Denied。 我使用的凭据与第 3 方工具中的凭据 100% 相同。

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

一个有效的 python 片段是:

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

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

最佳答案

在使用给定的答案作为研究的新基础后,我发现,一方面我必须为 S3Config 类提供一个 serviceurl、一个 regionendpoint 和一个通信协议(protocol),因为我知道文件的确切名称在存储桶中,我需要使用 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);

关于c# - Amazon S3 API .Net C# - 访问外部存储桶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23087141/

相关文章:

c# - 有没有人使用 Hessian 二进制远程协议(protocol)来桥接使用 Java 和 .NET 的应用程序?

c# - 有什么办法可以在WPF中实现“永久工具提示”类型的功能?

javascript - 如何使用 GraphQL POST 请求进行授权获取?

c# - 线程在for循环中休眠

c# - 无法生成显式迁移,因为以下显式迁移处于挂起状态

java - 我的 EMR 集群在哪里

android - 使用适用于 Java 的 AWS 开发工具包创建 AmazonSNSClient 时出现 NoClassDefFoundError

amazon-web-services - 如何配置 AWS S3 以允许 POST 像 GET 一样工作

javascript - Amazon S3 上传图像 - 直接从浏览器使用 Angular js

amazon-web-services - 如何在 Amazon-S3 和 Google Cloud Storage 之间执行文件完整性检查