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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:10:37