ASP.NET Core 8.0 Web API无法接收AddNewClientDTO,仅支持dynamic/object的解决方法
问题:ASP.NET Core Web API无法接收强类型DTO的问题
我正在开发一个用于向数据库添加客户端的ASP.NET Core 8.0 Web API,当前接口仅在将参数类型从AddNewClientDTO改为object或dynamic时才能正常工作。该API由ASP.NET Web应用通过Ocelot网关调用,采用Auth0认证(GET请求可正常执行);通过Postman测试时,接口能正常接收AddNewClientDTO并完成客户端添加,但Web应用调用时返回400错误。请问如何让AddClient方法正常接收AddNewClientDTO而非dynamic/object?是否是调用代码存在问题?
控制器代码
[ApiController] [Route("api/[controller]")] [Authorize()] public class ClientController : ControllerBase { private readonly IClientService ClientService; public ClientController(IClientService clientService) { this.ClientService = clientService; } [HttpPost("AddClient")] [Consumes("application/json")] public async Task<IActionResult> AddClient([FromBody]AddNewClientDTO client) { if (ModelState.IsValid) { await this.ClientService.AddClient(client); } return Ok(); } }
Web应用调用代码(原错误版本)
var jsonModel = JsonConvert.SerializeObject(model); using (HttpClient httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Accept.Clear(); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); httpClient.DefaultRequestHeaders.Add("authorization", $"Bearer {authenticationProviderKey}"); httpClient.DefaultRequestHeaders.Add("client", jsonModel); StringContent kpcontent = new StringContent(jsonModel, Encoding.UTF8, "application/json"); var kpresponse = await httpClient.PostAsync("https://localhost:7022/api/Client/AddClient", kpcontent); }
解决方案
问题根源在Web应用的调用代码中:你将序列化后的JSON数据同时放到了请求头(client头)和请求体中,这会干扰ASP.NET Core的模型绑定逻辑,导致无法正确解析AddNewClientDTO,从而返回400错误。
修复步骤
- 移除多余的请求头代码:
httpClient.DefaultRequestHeaders.Add("client", jsonModel);,不要把请求体数据放到请求头里 - 确保请求体的
StringContent正确设置application/json媒体类型(你的代码已正确配置)
修复后的调用代码
var jsonModel = JsonConvert.SerializeObject(model); using (HttpClient httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Accept.Clear(); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); httpClient.DefaultRequestHeaders.Add("authorization", $"Bearer {authenticationProviderKey}"); StringContent kpcontent = new StringContent(jsonModel, Encoding.UTF8, "application/json"); var kpresponse = await httpClient.PostAsync("https://localhost:7022/api/Client/AddClient", kpcontent); }
额外注意事项
- Postman测试正常是因为未添加多余的
client请求头,请求体JSON能被正确解析 - 改用
object/dynamic能工作是因为这类弱类型对绑定格式要求更低,但这并非正确解决方案 - 确保
AddNewClientDTO的属性名称与Web应用中model的属性名称完全匹配(默认大小写敏感,若需忽略可配置序列化规则)
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

