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字符串(适配你当前的测试逻辑)
- 修改B控制器的Action代码:
// 补充[HttpPost]标记(未加的话需要加),加[FromBody]指定从请求体读取内容 [HttpPost] public IActionResult addsonglyrics([FromBody] string addmysong=null) { return Ok(addmysong); //后续业务逻辑 }
- 修改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); }
- Postman测试配置:
请求方式选POST,URL填http://localhost:65302/api/getmylyrics/addasonglyric,请求体选raw,格式选JSON,把你准备的JSON内容粘贴进去发送即可。
方案2:直接接收结构化对象(更规范的生产环境用法)
如果后续需要处理JSON中的字段,直接用对象接收更方便,无需手动解析字符串:
- 修改B控制器的Action代码:
[HttpPost] public IActionResult addsonglyrics([FromBody] AddASongViewModel addmysong) { // 可直接访问addmysong.lyricsmetadata、addmysong.castLeads等属性 return Ok(addmysong); //后续业务逻辑 }
- A控制器的代码修改逻辑和方案1一致即可。
内容的提问来源于stack exchange,提问作者Harsha Gangari
相关产品推荐
相关产品推荐

