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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:16:17