我根据他们的解释查看了 MS 源代码 HttpClient 本身没有“内容类型”只有内容应该有内容类型。看起来合乎逻辑,除非您正在处理 MultipartFormDataContent。 MultipartFormDataContent 完全忽略了下面的代码:
string boundary = "--" + GenerateRandomString();
using (var content = new MultipartFormDataContent(boundary))
{
content.Headers.ContentType = new MediaTypeHeaderValue($"multipart/form-data");
content.Headers.ContentType.Parameters.Add(new NameValueHeaderValue("boundry", boundary));
...
}
请求中没有“Content-Type”。 并且还忽略:
string boundary = "--" + GenerateRandomString();
using (var content = new MultipartFormDataContent(boundary))
{
content.Headers.Remove("Content-Type");
content.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary);
...
}
尝试在 HttpClient 上设置它
client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary);
抛出以下错误:
System.InvalidOperationException: '误用 header 名称。确保请求 header 与 HttpRequestMessage 一起使用,响应 header 与 HttpResponseMessage 一起使用,内容 header 与 HttpContent 对象一起使用。
我可以找到很多关于如何使用 StringContent 执行此操作的示例,但没有一个使用 MultipartFormDataContent。 MultipartFormDataContent 允许为每个字段设置 Content-Type 和 Content-Disposition,我在客户端级别更需要这个。我需要一个看起来像这样的标题:
accept: application/json
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Authorization: Basic ZXlKbGRDSTZJakUxTWpZNU9UTXpOTnpkMjl5WkNJNklqa3haRGxtWkdKa1lUazRaVEJqWmpsalpUaGxNV1V3TXpOalxuWmpCbE1tVXhJaXdpZFhObGNpSTZJbUZrYldsdUluMD1cbjo=
Cache-Control: no-cache
许多非 Microsoft API 需要“边界”标记,以便它可以区分正在发送的数据的各个字段。此处对请求的验证似乎有点过头了。甚至 TryAddWithoutValidation 也不起作用(可能是错误?)。我意识到有可能以一种不需要的方式解释 RFC7578,但完全不允许它对我来说似乎也不正确。任何其他人都遇到过这个问题并解决它。
最佳答案
最初我认为这是一个 HttpClient 错误。我添加了日志记录来捕获请求和响应。日志记录缺少 header ,这让我相信缺少的“多部分/表单数据”内容 header 是问题所在,也是我使用的 API 不断告诉我找不到必填字段的原因。事实证明,当它是多部分/表单数据时,API 如何处理它发送的数据是一个问题。在 fiddler 中比较我的 HttpWebRequest 和 HttpClient 请求后,我发现发送的数据存在以下差异:
HttpWebRequest
----vekhftkcthxr
Content-Disposition: form-data; name="name";
d30-20180524
HttpClient
----bcgifxyjkmkw
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name=name
d30-20180524
我手动构建了 HttpWebRequest,所以我包含了引号和结束分号。 HttpClient 请求是为我构建的,不包括额外的引号和分号。因此,即使请求在技术上是正确的,我使用的 API 也不能很好地处理 HttpClient 生成的请求。
感谢 Panagiotis Kanavos 指出我的错误。
关于c# - 如何使用 MultipartFormDataContent 为 HttpClient 请求设置 Content-Type header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50496649/