Blazor中HttpClient.PostAsJsonAsync调用返回400错误问题
问题原因与解决方案
核心问题
你遇到的400 Bad Request错误,根源是ASP.NET Core模型绑定规则:对于string这类简单类型的Action参数,框架默认会从查询字符串、路由值或表单数据中读取,而不会自动解析请求体中的JSON字符串。你用PostAsJsonAsync发送的字符串是放在请求体里的,导致框架无法匹配到参数,因此返回400错误。
解决方案一:添加[FromBody]特性(推荐)
修改WeatherForecastController中的Post方法,给参数加上[FromBody]特性,明确告诉框架从请求体中绑定该参数:
[HttpPost] public async Task<ActionResult> Post([FromBody] string str) { return Ok(); }
修改后再调用PostAsJsonAsync就能正常匹配参数,不会返回400错误。同理,Put方法也需要给对应的简单类型参数添加[FromBody]特性。
解决方案二:通过查询字符串传递参数
如果不想修改Controller代码,可以把字符串参数放在查询字符串中传递,此时框架能自动绑定参数:
var reply = await Http.PostAsync("WeatherForecast?str=test the west", null);
这种方式适合短字符串,长字符串不推荐使用,因为查询字符串有长度限制。
为什么Get请求正常?
你的GetFromJsonAsync调用正常,是因为WeatherForecast的Get接口参数(如果有的话)是从路由或查询字符串获取的,符合框架默认的模型绑定规则,所以能正确匹配。
内容的提问来源于stack exchange,提问作者Petteri Fischer
相关产品推荐
相关产品推荐

