我根据他们的解释看了MS源代码,HttpClient本身没有“Content-Type”,只有内容应该有内容类型。除非您正在处理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: 'Misused header name. Make sure request headers are used with HttpRequestMessage, response headers with HttpResponseMessage, and content headers with HttpContent objects.'
我可以找到很多使用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需要“boundary”标记,以便区分正在发送的数据的各个字段。这里对请求的验证似乎有点过头了。即使TryAddWithoutValidation不起作用(也许是一个错误?)。我意识到有可能以一种不应该被要求的方式解释RFC7578,但是不允许它对我来说也不合适。任何其他人都遇到过这个问题并解决它。
答案 0 :(得分:0)
最初我认为这是一个HttpClient错误。我添加了日志记录来捕获请求和响应。日志记录缺少标题,这使我相信缺少的"多部分/表单数据"内容标题是问题,我使用的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向我展示我的错误。