c# - 使用 RestSharp (C#) 向 aws 发出请求

标签 c# rest amazon-s3 restsharp

我正在尝试将 AWS S3 的 REST 接口(interface)用于 Web 服务,该服务以类似 git 的方式存储和检索文件片段(通过哈希和基于它的目录系统)。我正在使用 RestSharp 客户端库进行这些调用,因为 AWS SDK 是不可能的(Web 服务实际上需要与类似 AWS 的商店(如 Hitachi HDS)一起工作),而且一般来说,更多的存储平台将是补充说,人们认为执行有线通信的最佳方法是标准化方法。

问题在于 RestSharp 可能会添加一些额外的有效负载,因为 S3 要求保存多个数据元素。

以下代码是核心存储逻辑,需要注意的是我使用的是Ninject来处理任何依赖。

public bool PutBytesInStore(string piecehash, byte[] data)
        {
            string method = "POST";
            string hash;
            using (var sha1 = new SHA1CryptoServiceProvider())
            {
                hash = Convert.ToBase64String(sha1.ComputeHash(data));
            }

            string contentType = "application/octet-stream";
            string date = new DateTime().ToString("{EEE, dd MMM yyyy HH:mm:ss}");
            string file = string.Format("pieces/{0}/{1}/{2}", piecehash.Substring(0, 2), piecehash.Substring(0, 6),
                piecehash);

            //Creating signature
            var sBuilder = new StringBuilder();
            sBuilder.Append(method).Append("\n");
            sBuilder.Append(contentType).Append("\n");
            sBuilder.Append(date).Append("\n");
            sBuilder.Append(hash).Append("\n");
            sBuilder.Append(file).Append("\n");
            var signature = Convert.ToBase64String(new HMACSHA1(Encoding.UTF8.GetBytes(_password)).ComputeHash(Encoding.UTF8.GetBytes(sBuilder.ToString())));

            _request.Method = Method.POST;
            _request.AddFile(piecehash, data, piecehash);
            _request.AddHeader("Date", date);
            _request.AddHeader("Content-MD5", hash);
            _request.AddHeader("Authorisation", string.Format("AWS {0}:{1}", _identifier, signature));

            var response = _client.Execute(_request);

            //Check responses for any errors
            var xmlResponse = XDocument.Parse(response.Content);
            switch (response.StatusCode)
            {
                case HttpStatusCode.Forbidden:
                    ErrorCodeHandler(xmlResponse);
                    break;
                case HttpStatusCode.BadRequest:
                    ErrorCodeHandler(xmlResponse);
                    break;
                case HttpStatusCode.Accepted:
                    return true;
                default:
                    return false;
            }
            return false;
        }

问题在于发送的响应,它读取;

<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>InvalidArgument</Code>
    <Message>POST requires exactly one file upload per request.</Message>      
    <ArgumentValue>0</ArgumentValue>
    <ArgumentName>file</ArgumentName>
    <RequestId>SomeRequest</RequestId 
    <HostId>SomeID</HostId>
</Error>

AWS API 似乎是pretty sparse在此消息上,我似乎无法弄清楚为什么 RestSharp 客户端会向有效负载添加两个以上的文件。

非常感谢任何帮助。

最佳答案

这是因为 webkit 边界。请在 postman 上试试你的东西 - webkit 边界对上传非常重要。

关于c# - 使用 RestSharp (C#) 向 aws 发出请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20185060/

相关文章:

c# - 什么是 VB.NET 等同于 C#'s ' using' block

c# - 如何知道类型参数是否是动态的?

python - Boto3 AWS S3 存储桶创建错误

c# - 我可以先对数据库使用覆盖 OnModelCreating 方法吗

c# - 如何解析包含引号的字符串

c# - DTO 与 WCF 层中的业务对象

Firebase 云消息传递 : REST API responds with "INVALID_KEY"

web-services - Get 和 post 方法与 HTTP 和 REST 的区别

amazon-web-services - 将 cloudfront 通配符 CNAME 子域路由到 s3 存储桶中的文件夹

python - AWS BotoCore 错误 - AttributeValue 不能包含空字符串