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

ASP.NET Core Web API在Swagger可用,Postman等调用报400错误求助

排查ASP.NET Core Web API 400错误(Swagger可调用,外部客户端失败)

可能的原因及解决方案

1. JSON序列化命名策略不匹配

这是最常见的触发原因:Swagger会遵循API端默认的驼峰命名规则生成请求体,但外部客户端(Postman/MVC/Angular)发送的JSON属性名可能是大驼峰格式(如UserName),导致API端模型绑定失败,触发ModelState.IsValid = false,最终返回400错误。

解决方法:

  • 统一客户端序列化策略:
    在MVC调用代码中,强制使用驼峰命名序列化模型:

    var options = new JsonSerializerOptions
    {
        PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    };
    var json = JsonSerializer.Serialize(model, options);
    var content = new StringContent(json, Encoding.UTF8, "application/json");
    

    Postman中手动修改请求体属性名为驼峰(userName、password),和Swagger中显示的格式完全一致。

  • API端配置大小写不敏感绑定:
    在Program.cs中配置JSON序列化忽略属性名大小写,兼容不同命名格式:

    builder.Services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
        });
    

2. 未查看详细错误信息

你当前的API返回的400错误仅提示"Invalid Input",无法定位具体字段问题。修改API代码,返回ModelState的详细错误详情:

return BadRequest(new ResponseResultViewModel
{
    Result = "Invalid Input",
    Description = "Invalid input",
    Error = new ErrorViewModel
    {
        Code = "2",
        Message = string.Join("; ", ModelState.Values.SelectMany(v => v.Errors.Select(e => e.ErrorMessage)))
    }
});

调用后查看响应体的Error.Message字段,就能明确是哪个字段验证失败或无法绑定。

3. HttpClient使用不当

你的MVC调用代码存在两个潜在问题:

  • 使用.Result同步等待异步操作,可能导致死锁,改用async/await规范写法:
    public async Task<IActionResult> Index(LoginViewModel model)
    {
        var options = new JsonSerializerOptions
        {
            PropertyNamingPolicy = JsonNamingPolicy.CamelCase
        };
        var json = JsonSerializer.Serialize(model, options);
        var content = new StringContent(json, Encoding.UTF8, "application/json");
        // 直接使用相对路径,BaseAddress已包含/api前缀
        var response = await _httpClient.PostAsync("authorization/login", content);
    
        if (response.IsSuccessStatusCode)
        {
            var resultContent = await response.Content.ReadAsStringAsync();
            return Json(resultContent);
        }
        else
        {
            var errorContent = await response.Content.ReadAsStringAsync();
            return Json(new { StatusCode = response.StatusCode, ErrorDetails = errorContent });
        }
    }
    
  • 若存在SSL证书验证问题,配置HttpClient忽略SSL错误:
    public LoginController()
    {
        var handler = new HttpClientHandler
        {
            ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true
        };
        _httpClient = new HttpClient(handler);
        _httpClient.BaseAddress = baseAdress;
    }
    

4. 路由拼接问题

检查MVC调用的URL是否正确:_httpClient.BaseAddress是https://localhost:44355/api,拼接/authorization/login后得到https://localhost:44355/api/authorization/login,确保API控制器名称是AuthorizationController(路由api/[controller]会映射为api/Authorization)。ASP.NET Core路由默认不区分大小写,但若控制器名称拼写错误会导致404(但你返回的是400,此可能性较低)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:03:12