You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#使用HttpClient发POST请求如何强制Content-Type仅为application/json

解决方案

你遇到的问题是因为只要在StringContent构造函数中传入了编码参数,框架就会自动在Content-Type头后追加charset后缀,不管传入的是Default、UTF8还是其他编码都会触发该逻辑,和你使用同步Send还是异步SendAsync发送请求无关。
你可以选择以下任意一种方式修改即可实现纯application/json的Content-Type头:

方案1:创建StringContent后手动覆盖ContentType

构造StringContent时不传入编码和媒体类型参数,之后直接给ContentType赋值未指定CharSet的MediaTypeHeaderValue:

var httpClientHandler = new HttpClientHandler();
httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) =>
{
    return true;
};
var client = new HttpClient(httpClientHandler);
var webRequest = new HttpRequestMessage(HttpMethod.Post, base_url + url)
{
    // 构造时不指定编码和媒体类型
    Content = new StringContent(body)
};
// 手动设置ContentType,不会自动追加charset
webRequest.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
webRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", apitoken);
webRequest.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
Console.WriteLine(webRequest.RequestUri);
Console.WriteLine(webRequest.Headers.ToString());
var response = client.Send(webRequest);

方案2:手动清空CharSet属性

如果需要保留编码设置,可以在创建StringContent后手动将ContentType的CharSet属性设为null:

var content = new StringContent(body, Encoding.UTF8, "application/json");
// 移除charset后缀
content.Headers.ContentType.CharSet = null;
webRequest.Content = content;

两种方案都可以完全移除Content-Type头中的charset参数,满足接口要求。

内容的提问来源于stack exchange,提问作者Meerfall the dewott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:54:01