RestSharp 文件上传在 v106.15 中有效在 107.1.1 中失败

RestSharp File upload works in v106.15 fails in 107.1.1

我正在通过他们的 API 将截图失败 png 上传到 Test Rail - 这是在 106 中工作的代码:

Request = new RestRequest("/index.php?/api/v2/add_attachment_to_result/85)
.AddHeader("Content-Type", "multipart/form-data")
.AddFile("attachment", "C:\Source\screenshot.png");

IRestResponse AddAttachmentResponse = Client.Post(Request);

升级到 v107 后我唯一改变的是最后一行:

RestResponse AddAttachmentResponse = Client.PostAsync(Request).GetAwaiter().GetResult();

我现在从 Test Rail API“Bad Request”收到错误消息 - 这是关于他们 API 的文档:Test Rail Add Attachment API doc - 我知道 http 引擎已更改107 - 我现在需要做哪些不同的事情?

更新: 看起来 v107 没有在 header 中发送 Content-Type - 这是 HttpTracer 的输出:

==================== HTTP 错误请求:[POST] ============== ====== 授权:基本 TokenRemoved 接受:application/json、text/json、text/x-json、text/javascript、*+json、application/xml、text/xml、+xml, * User-Agent: RestSharp/107.1.1.0 Accept-Encoding: gzip, deflate, br 饼干:tr_session=7cef485e-1aca-46bb-a773-9d9f5d410ee6 --8eef1c58-a3df-4ddb-a1c5-e081ccf90709 Content-Type: application/octet-stream Content-Disposition: form-data;名称=附件;文件名=Untitled.png;文件名=utf-8''Untitled.png

为简洁起见被删减

请注意 body 中有 Content-Type,但 header 中有 none。

问题link:https://github.com/restsharp/RestSharp/issues/1713

正如我们讨论的那样,HttpTracer只显示请求headers,而Content-Type是请求header。

在调试这个问题(以及其他几个相关问题)时,我们发现问题是由于服务器无法处理表单中的 namefilename 参数引起的部分 (Content-Disposition header) 如果它们没有用引号引起来。奇怪的是,直接使用 ContentDispositionHeaderValue 添加内容配置默认情况下不会添加引号。手动添加它们后开始工作:

fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") {
    Name     = $"\"{file.Name}\"",
    FileName = $"\"{file.FileName}\""
};

我的回答是给遇到类似问题的 107.1 的任何人,最新的 alpha 和下一个稳定版本应该会正确处理这个问题。