You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Blazor WASM托管版发布后Login接口返回404问题求助

解决Blazor WASM托管模板发布后Login接口404的问题

我来帮你排查这个头疼的问题——开发环境一切正常,发布后却只有Get接口能访问,Login接口返回404。咱们一步步拆解可能的原因和解决方案:

1. 先排查路由大小写问题(最常见的坑)

开发环境用Windows的话,文件系统和路由是不区分大小写的,但发布到Linux服务器或者IIS时,路由匹配会严格区分大小写。你控制器里的路由是[Route("api/[controller]")](对应api/Account),Login Action的路由是[HttpPost("Login")],完整路由是api/Account/Login;但你客户端调用的是小写的api/account/login,这在发布环境里就会匹配失败导致404。

快速验证/解决

  • 要么把客户端调用的URL改成和路由一致的大小写:"api/Account/Login"
  • 要么在服务端配置全局小写路由,一劳永逸:
    在服务端Startup.csConfigureServices方法里添加:
    services.AddRouting(options => 
    {
        options.LowercaseUrls = true;
        options.LowercaseQueryStrings = true;
    });
    

2. 确认服务端端点配置顺序正确

托管模板的服务端Startup.cs里,API控制器的路由映射必须放在Blazor的 fallback 之前,否则请求会被Blazor的SPA fallback拦截,导致API接口找不到。

检查你的Configure方法里的端点配置:

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers(); // 这个必须在MapFallbackToFile前面!
    endpoints.MapFallbackToFile("index.html");
});

如果MapControllers()MapFallbackToFile()之后,所有非静态文件的请求都会被导向Blazor的index.html,自然找不到Login接口。

3. 验证HttpClient的BaseAddress配置

Blazor客户端的HttpClient基地址在开发环境会自动配置,但发布后可能因为部署路径问题导致地址错误,进而请求了不存在的URL。

检查客户端Program.cs里的HttpClient注册:

builder.Services.AddScoped(sp => new HttpClient 
{ 
    BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) 
});

确保builder.HostEnvironment.BaseAddress指向的是服务端API的正确根地址,比如如果部署在子目录下,这个地址是否包含子目录路径。

4. 关于你怀疑的返回类型问题

其实Task<ActionResult<UserToken>>本身没有问题——开发环境正常运行已经证明了这一点。不过如果你想验证,可以临时修改Login方法的返回类型,用更直接的方式返回:

[HttpPost("Login")]
public async Task<IActionResult> Login([FromBody] UserInfo userInfo)
{
    var result = await _signInManager.PasswordSignInAsync(userInfo.Email, userInfo.Password, isPersistent: false, lockoutOnFailure: false);
    if (result.Succeeded)
    {
        var token = await GenerateTokenAsync(userInfo);
        return Ok(token); // 直接返回Ok结果
    }
    else
    {
        return BadRequest(new { message = "Login inválido" });
    }
}

如果修改后还是404,说明问题确实不在返回类型上,还是路由或部署配置的问题。

5. 开启服务端日志定位根源

如果以上方法都没解决,建议开启服务端的详细日志,看看请求到底有没有到达服务端,以及路由匹配的情况:
在服务端的appsettings.json里调整日志级别:

"Logging": {
  "LogLevel": {
    "Default": "Information",
    "Microsoft.AspNetCore.Routing": "Debug" // 专门开启路由日志
  }
}

发布后查看日志文件(如果是IIS,日志在wwwroot/logs目录;如果是Linux,看控制台输出或指定的日志路径),里面会显示请求的URL、路由匹配的过程,能帮你精准定位问题。

内容的提问来源于stack exchange,提问作者Luiz Eugênio Barbieri

火山引擎 最新活动