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

C#中MVC控制器向API控制器HttpPost接口发送JSON字符串失败如何解决

问题原因总览

参数为null的核心问题是参数绑定规则不匹配+请求发送逻辑错误,具体错误点如下:

  • 错误1:B控制器参数未指定绑定来源,查询参数格式错误
    默认情况下,ASP.NET Core对于string这类简单类型参数,会优先从URL查询字符串中取值。你A控制器的请求URL写为addasonglyric?addmysong,属于不完整的查询参数,只有键没有值,B自然无法拿到值;Postman测试时你把内容放在请求体中,又没有告知B要从请求体读取参数,同样拿不到值。
  • 错误2:A控制器存在重复序列化问题
    你先手动调用JsonConvert.SerializeObject把对象序列化为JSON字符串,接着又用PostAsJsonAsync方法发送这个字符串。PostAsJsonAsync本身会自动对传入对象做JSON序列化,等于最终发送的请求体是被二次转义的字符串,不是你预期的原始JSON结构。
  • 错误3:参数类型和接收方式不匹配
    如果你要直接把整个请求体的JSON作为字符串接收,需要给参数加[FromBody]标记;如果你要接收结构化对象,应该把参数类型替换为对应的AddASongViewModel,同时加[FromBody]标记。

修正方案

方案1:从请求体接收整个JSON字符串(适配你当前的测试逻辑)

  1. 修改B控制器的Action代码:
// 补充[HttpPost]标记(未加的话需要加),加[FromBody]指定从请求体读取内容
[HttpPost]
public IActionResult addsonglyrics([FromBody] string addmysong=null)
{
    return Ok(addmysong);
    //后续业务逻辑
}
  1. 修改A控制器的请求发送逻辑,避免重复序列化:
public IActionResult addsonglyrics([FromForm] AddASongViewModel AddASong)
{
    var contactgetmylyricsFindSong = new HttpClient();
    contactgetmylyricsFindSong.BaseAddress = new Uri("http://localhost:65302/api/getmylyrics");
    // 直接传对象,让PostAsJsonAsync自动序列化,不需要提前转为字符串
    var resultofSendSong = contactgetmylyricsFindSong.PostAsJsonAsync("addasonglyric", AddASong);
    resultofSendSong.Wait(); // 异步方法等待完成再取结果,避免死锁
    return Ok(resultofSendSong.Result);
}
  1. Postman测试配置:
    请求方式选POST,URL填http://localhost:65302/api/getmylyrics/addasonglyric,请求体选raw,格式选JSON,把你准备的JSON内容粘贴进去发送即可。

方案2:直接接收结构化对象(更规范的生产环境用法)

如果后续需要处理JSON中的字段,直接用对象接收更方便,无需手动解析字符串:

  1. 修改B控制器的Action代码:
[HttpPost]
public IActionResult addsonglyrics([FromBody] AddASongViewModel addmysong)
{
    // 可直接访问addmysong.lyricsmetadata、addmysong.castLeads等属性
    return Ok(addmysong);
    //后续业务逻辑
}
  1. A控制器的代码修改逻辑和方案1一致即可。

内容的提问来源于stack exchange,提问作者Harsha Gangari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:36:04