c# - 如何使用 MultipartFormDataContent 为 HttpClient 请求设置 Content-Type header ?

标签 c# .net-core httpclient .net-core-2.0 .net-standard-2.0

我根据他们的解释查看了 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/

相关文章:

c# - 我应该使用多个嵌套的 "using"语句吗?

c# - 构建一个 c# 桌面应用程序,从头开始,请提示

c# - 我可以在一个环境中使用不同的配置运行两个 TestServers 吗?

c# - 如何在应用预测器之前从 ML.Net 管道返回转换后的数据

java.net.SocketException : Connection reset on TCP 异常

c# - 捕获最小化远程桌面的屏幕截图

c# - 如何根据文本调整按钮大小

c# - ImageMagick 不能在 docker 环境中工作

java - FIN ACK TCP 延迟

c# - 如何将json反序列化为对象