如何在RestSharp文件上传请求中添加Content-Md5 Header?

问题描述 投票:0回答:1

我正在尝试将字符串列表作为 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)
导致它失败,但我不知道还能做什么。

欢迎任何有关如何解决此问题的建议。如果您发现任何遗漏或想要澄清,请告诉我。

c# amazon-s3 md5 restsharp pre-signed-url
1个回答
0
投票

RestSharp.AddFile
将您的请求编码为
multipart/form-data
,而您的预签名 URL 和哈希算法都期望请求正文中包含原始文件数据。

代替

AddFile
,使用
AddStringBody

如果您有预序列化的有效负载(例如 JSON 字符串),则可以使用 AddStringBody 将其添加为主体参数。您需要指定内容类型,以便远程端点知道如何处理请求正文。

© www.soinside.com 2019 - 2024. All rights reserved.