.NET Core 2.2升级3.1后PostAsJsonAsync报错,求解决方案及替代方案
解决.NET Core 3.1中HttpClient缺少PostAsJsonAsync的问题
这个问题我在升级.NET Core项目的时候也碰到过,核心原因是从.NET Core 3.0开始,PostAsJsonAsync这类JSON相关的HttpClient扩展方法不再默认包含在框架核心包中,所以编译器找不到对应的定义。下面给你几个可行的解决方案,按需选择:
方案1:使用官方推荐的新JSON扩展包(推荐)
微软在.NET Core 3.0+推出了专门的System.Net.Http.Json包,提供了更现代化的JSON处理扩展方法,包括新版的PostAsJsonAsync。
- 步骤1:通过NuGet包管理器安装
System.Net.Http.Json - 步骤2:在代码文件顶部添加using指令:
using System.Net.Http.Json; - 步骤3:你可以继续使用原有的调用代码,甚至还能简化后续的反序列化步骤:
HttpResponseMessage resNews = await client.PostAsJsonAsync("News/GetNews", News); if (resNews.IsSuccessStatusCode) { UiLogger.LogInfo("News api called"); // 直接用ReadFromJsonAsync反序列化,无需手动处理字符串 newsItem = await resNews.Content.ReadFromJsonAsync<News>(); }
方案2:安装兼容包保留原有代码逻辑
如果你不想修改太多代码,只想快速恢复原来的PostAsJsonAsync方法,可以安装兼容包:
- 步骤1:安装NuGet包
Microsoft.AspNetCore.Mvc.WebApiCompatShim - 步骤2:添加using指令:
using Microsoft.AspNetCore.Mvc; - 完成后,你的原有代码就可以正常运行,不需要任何逻辑改动。
方案3:手动序列化JSON(无额外依赖)
如果不想引入任何新的NuGet包,完全可以手动完成JSON序列化和请求构造,这是最轻量化的方式:
// 用Newtonsoft.Json(你项目里已经在用的)序列化对象 string jsonPayload = JsonConvert.SerializeObject(News); // 创建指定内容类型的StringContent var requestContent = new StringContent( jsonPayload, System.Text.Encoding.UTF8, "application/json" ); // 用HttpClient的PostAsync方法发送请求 HttpResponseMessage resNews = await client.PostAsync("News/GetNews", requestContent); if (resNews.IsSuccessStatusCode) { UiLogger.LogInfo("News api called"); // 这里建议用await替代.Result,避免潜在的死锁问题 var result = await resNews.Content.ReadAsStringAsync(); newsItem = JsonConvert.DeserializeObject<News>(result); }
另外提个小建议:你原来代码里的ReadAsStringAsync().Result容易引发线程死锁,换成await会更安全可靠。
内容的提问来源于stack exchange,提问作者SAGAR SAHA
相关产品推荐
相关产品推荐

