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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:12:27