HttpClient / .NET Core 不支持的媒体类型

Unsupported Media Type with HttpClient / .NET Core

我正在使用支持 JSON 格式的 POST 请求的 RESTful API。 API 自己的 Swagger 文档显示这是对其端点之一的有效调用:

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '<JSON>' '<URL>'

其中 <JSON><URL> 是有效的 JSON 消息和端点的 URL。从这个 Swagger 文档我收集到任何 posts 到这个端点必须包括一个 Content-TypeAccept headers 设置为 application/json.

我正在编写一个 C# 方法,它将使用 .NET Core 的 HttpClient class 到 post 到此端点。但是,在 post 发送我的消息后,我收到了 HTTP 415 错误代码,表示不支持的媒体类型。根据我到目前为止所学到的,必须在您的内容中设置 Content-Type header(我使用的是 StringContent class)和 Accept header只能在HttpClientheader中设置。这是我的具体示例:

var httpContent = new StringContent("<JSON>", Encoding.UTF32, "application/json");
var httpClient = new HttpClient();

httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

var responseMessage = httpClient.PostAsync("<URL>", httpContent);
var result = responseMessage.Result;

再一次,<JSON><URL> 是有效的 JSON 消息和端点的 URL。在我看来,我引用 httpCllient.DefaultRequestHeaders 的第三行没有将 Accept: application/json header 添加到我的请求中。如果我手动将 header 添加到 httpContent.Headers collection,我会得到一个 run-time 错误,告诉我 Accept 不是 header 我可以添加到httpContent。这就是为什么我希望将它添加到 httpClient 中。

我已经用 Swagger 验证了 URL 和我的 JSON,所以我知道它们是正确的。此外,请求是通过 HTTPS 完成的,因此我无法使用 Fiddler 来验证是否包含 Accept header。虽然我可以在 Fiddler 中启用解密,但这完全是另一回事。我不想将他们的根证书添加到我的系统中,尤其是当我遗漏了一些相当简单的东西时,这似乎是这样。

任何指点将不胜感激。谢谢。

如果你试试呢:

var httpContent = new StringContent(jsonData, Encoding.UTF8, "application/json");

您不需要添加接受 header。