我正在尝试将字符串列表作为 csv 上传到 AWS S3 中的预签名 URL。
我已使用默认的 .NET HttpClient 成功上传此内容,但我无法使用 RestSharp RestClient 执行相同的操作。
AWS 返回的错误是:BadDigest - 您指定的 Content-MD5 与我们收到的不匹配。
这些是我一直在使用的代码部分。两者都有相同的输入:
ids
:字符串列表md5
:byte[]
,用md5.ComputeHash()
库中的
System.Security.Cryptography
url
:预签名 URL使用HttpClient上传:(成功)
using (var ms = new MemoryStream())
{
using (var sw = new StreamWriter(ms, new UTF8Encoding(false), 8192, true))
{
sw.Write(string.Join(Environment.NewLine, ids));
}
ms.Position = 0;
var file = ms.ToArray();
var content = new ByteArrayContent(file);
content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
content.Headers.ContentLength = file.Length;
content.Headers.ContentMD5 = md5;
var client = new HttpClient();
var result = client.PutAsync(url, content).Result;
var response = result.Content.ReadAsString();
}
使用 RestSharp 上传:(失败 - 错误摘要)
using (var ms = new MemoryStream())
{
using (var sw = new StreamWriter(ms, new UTF8Encoding(false), 8192, true))
{
sw.Write(string.Join(Environment.NewLine, ids));
}
ms.Position = 0;
var file = ms.ToArray();
var md5Based64 = Convert.ToBase64String(md5).Replace("-", "");
var options = new FileParameterOptions
{
DisableFilenameEncoding = true,
};
var uploadRequest = new RestRequest()
.AddFile("", file, "", "text/csv", options)
.AddOrUpdateHeader("Content-Md5", md5Based64)
.AddOrUpdateHeader("Content-Length", file.Length)
.AddOrUpdateHeader("Content-Type", "text/csv");
var restClient = new RestClient(
new Uri(url),
configureSerialization: cfg =>
{
cfg.UseNewtonsoftJson();
},
useClientFactory: true
);
var response = restClient.ExecuteAsync(uploadRequest, Method.Put).Result;
}
我觉得
md5
和md5Based64
之间的转换可能是这里的关键,或者可能手动添加标题AddOrUpdateHeader("Content-Md5", md5Based64)
导致它失败,但我不知道还能做什么。
欢迎任何有关如何解决此问题的建议。如果您发现任何遗漏或想要澄清,请告诉我。
RestSharp.AddFile
将您的请求编码为 multipart/form-data
,而您的预签名 URL 和哈希算法都期望请求正文中包含原始文件数据。
代替
AddFile
,使用 AddStringBody
:
如果您有预序列化的有效负载(例如 JSON 字符串),则可以使用 AddStringBody 将其添加为主体参数。您需要指定内容类型,以便远程端点知道如何处理请求正文。