Blazor WASM调用PostAsJsonAsync时出现控制器未找到问题
排查Blazor WASM调用API返回HTTP 400错误的常见原因
HTTP 400是请求格式错误,并非资源未找到(404),先明确这一点,以下是几个优先排查的方向:
1. 确认API控制器路由配置已生效
检查Server项目的Program.cs,确保添加了控制器路由映射,否则API无法被正确匹配:
var app = builder.Build(); // 其他中间件配置(如静态文件、CORS等)... // 必须添加此行,启用API控制器路由 app.MapControllers(); app.Run();
2. 排查模型绑定验证错误
HTTP 400绝大多数是因为[FromBody]绑定的模型不符合验证规则,比如必填字段缺失、数据类型不匹配等:
- 客户端捕获错误详情:
var msg = await Http.PostAsJsonAsync<u001_000_001>("api/u001_000_001", userRec); if (!msg.IsSuccessStatusCode) { var errorDetails = await msg.Content.ReadAsStringAsync(); // 在浏览器开发者工具控制台查看具体错误信息 Console.WriteLine(errorDetails); } - 服务端主动检查模型状态:
[HttpPost] public async Task<IActionResult> Post([FromBody] u001_000_001 create) { if (!ModelState.IsValid) { // 返回详细的验证错误给客户端 return BadRequest(ModelState); } var user = await db.u001_000_001.AddAsync(create); await db.SaveChangesAsync(); return Ok(user.Entity); }
3. 统一JSON序列化的命名规则
Blazor客户端默认用camelCase序列化JSON,而C#模型默认是PascalCase,可能导致属性无法绑定:
- 方案1:服务端配置JSON忽略大小写匹配,修改Server项目
Program.cs:builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; }); - 方案2:给模型属性显式指定JSON字段名,在Shared项目的模型类中添加特性:
public class u001_000_001 { [JsonPropertyName("userName")] public string UserName { get; set; } // 其他属性同理配置 }
4. 验证HttpClient的baseAddress配置
确保Client项目Program.cs中HttpClient的baseAddress指向正确的Server根地址:
builder.Services.AddHttpClient("ApiClient", client => { // 示例:Server的运行地址,需和实际启动地址一致 client.BaseAddress = new Uri("https://localhost:5001/"); });
同时组件中要注入正确的HttpClient实例:
// 若使用命名客户端,需注入IHttpClientFactory @inject IHttpClientFactory HttpClientFactory // 在方法中创建客户端 var http = HttpClientFactory.CreateClient("ApiClient"); var msg = await http.PostAsJsonAsync<u001_000_001>("api/u001_000_001", userRec);
5. 确认控制器类的访问权限
你的控制器类已经是public修饰符,路由[Route("api/[controller]")]会自动去掉类名后缀Controller,生成的路由api/u001_000_001和客户端请求路径一致,这部分无需调整。
内容的提问来源于stack exchange,提问作者Ehsan
相关产品推荐
相关产品推荐

