最常出错的是Content-Type不匹配或对象未序列化:必须手动序列化为JSON字符串,并用StringContent指定"application/json"和UTF8编码,否则后端无法解析。

HttpClient.PostAsync 传参容易错在哪儿
直接用 PostAsync 发送 JSON 数据时,最常出错的是没设对 Content-Type 或忘了把对象序列化成字符串。默认它只认 StringContent 或 ByteArrayContent,不会自动帮你转 JSON。
- 必须手动用
System.Text.Json.JsonSerializer.Serialize(.NET Core 3.0+)或Newtonsoft.Json.JsonConvert.SerializeObject转对象 -
StringContent构造时第二个参数要显式传Encoding.UTF8,否则中文可能乱码 - 第三个参数必须是
"application/json",写成"text/json"或漏掉会触发 WebAPI 模型绑定失败(ModelState.IsValid == false)
示例:
var client = new HttpClient();
var data = new { Name = "张三", Age = 25 };
var json = JsonSerializer.Serialize(data);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://api.example.com/users", content);
怎么复用 HttpClient 实例而不踩 DNS 缓存坑
很多人以为每次 new 一个 HttpClient 很安全,其实会导致端口耗尽和 DNS 缓存不更新——尤其在服务地址做了负载均衡或蓝绿发布时,旧 IP 可能还在连接池里挂着。
- 应该用
IHttpClientFactory(ASP.NET Core 推荐)或静态单例HttpClient实例 - 若手动管理生命周期,记得设置
Timeout和DefaultRequestHeaders,但不要改BaseAddress—— 它不是线程安全的 - DNS 缓存默认 TTL 是 2 分钟,可通过
ServicePointManager.FindServicePoint(url).ConnectionLeaseTimeout强制刷新(仅 .NET Framework),.NET 5+ 建议用HttpClientHandler.PooledConnectionLifetime
Post 表单数据(x-www-form-urlencoded)和 JSON 的写法差异
调第三方登录、OAuth 或老系统接口时,常要发表单格式,不是 JSON。两者底层都是 HTTP body,但构造方式完全不同,混用就 400。
- JSON 用
StringContent+"application/json" - 表单用
FormUrlEncodedContent,传Dictionary或IEnumerable> - 别试图用
JsonSerializer序列化字典再塞进FormUrlEncodedContent—— 它会把整个 JSON 字符串当一个字段值发出去
示例(发登录表单):
var formData = new Dictionary<string string>
{
["username"] = "admin",
["password"] = "123456"
};
var content = new FormUrlEncodedContent(formData);
var response = await client.PostAsync("https://api.example.com/login", content);
</string>
异步等待没加 await 导致死锁或超时
在 ASP.NET Framework(非 Core)同步上下文里,如果调 PostAsync 后只用 .Result 或 .Wait(),极大概率卡主线程。.NET Core 默认无同步上下文,但仍有超时风险。
- 所有
PostAsync调用必须配await,不要用阻塞式等待 - Controller Action 必须声明为
async Task,不能返回Task或void - 单元测试里用
GetAwaiter().GetResult()是临时妥协,上线代码禁止出现
真正麻烦的是嵌套调用:比如你在 OnActionExecuting 里发请求,又没注意上下文切换,就容易触发 HttpRequestException: Response status code does not indicate success: 0 (Unknown Error) —— 这其实是请求根本没发出去,连接被丢弃了。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











