ASP.NET Core Web API在Swagger可用,Postman等调用报400错误求助
可能的原因及解决方案
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

