Blazor Server项目中无法访问API控制器的问题求助
Blazor Server项目API接口404问题排查与解决
问题描述
我正在开发兼具UI与API托管功能的Blazor Server项目,已创建Controllers文件夹并添加API控制器,且在Program.cs中配置了相关服务。项目可正常构建启动,但使用Postman调用接口https://localhost:7131/api/GetApplicationNames时,始终收到“Sorry, there's nothing at this address.”的错误信息。
相关代码
Program.cs
using Microsoft.EntityFrameworkCore; using UsersAdmin_BlazorServer.Data; using UsersAdmin_BlazorServer.Interfaces; using UsersAdmin_BlazorServer.Models; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddRazorPages(); builder.Services.AddControllers(); builder.Services.AddServerSideBlazor(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddTransient<IAppManager, AppManager>(); builder.Services.AddTransient<IDataManager, DataManager>(); builder.Services.AddSingleton<WeatherForecastService>(); //Adds DataContext dependency var connString = builder.Configuration["ConnectionStrings:DbConnection"]; builder.Services.AddDbContext<DataContext>(options => { options.UseSqlServer(connString); }); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.MapControllers(); app.UseRouting(); app.MapBlazorHub(); app.MapFallbackToPage("/_Host"); app.Run();
AppController.cs
[ApiController] [Route("api")] public class AppController : ControllerBase { private readonly ILogger<AppController> _log; private readonly IAppManager _appManager; private readonly IDataManager _dataManager; public AppController(ILogger<AppController> log, IAppManager appManager, IDataManager dataManager) { _log = log; _appManager = appManager; _dataManager = dataManager; } [HttpGet] [Route("/GetApplicationNames")] public List<string> GetApplicationNames() { List<string> listApplicationNames = new List<string>(); listApplicationNames = _dataManager.GetApplicationNames(); return listApplicationNames; } }
问题原因
- 路由配置冲突:控制器类上的
[Route("api")]定义了基础路由前缀,但Action方法上的[Route("/GetApplicationNames")]使用了绝对路由(开头的斜杠),这会直接覆盖控制器的基础路由,导致接口实际路由为/GetApplicationNames,而非预期的/api/GetApplicationNames。 - 中间件顺序不规范:
app.MapControllers()放在了app.UseRouting()之前,虽不是本次404的直接原因,但不符合ASP.NET Core中间件执行顺序规范,可能引发其他路由问题。
解决方案
1. 修正Action路由(核心修复)
将Action上的路由改为相对路由,移除开头的斜杠,让它与控制器的基础路由合并:
[HttpGet] [Route("GetApplicationNames")] // 也可简化为:[HttpGet("GetApplicationNames")] public List<string> GetApplicationNames() { // 原有代码保持不变 }
修改后,接口完整路由将变为/api/GetApplicationNames,与调用地址完全匹配。
2. 调整中间件顺序(优化建议)
将app.MapControllers()移至app.UseRouting()之后,确保路由匹配逻辑正确执行:
app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.MapControllers(); // 调整到此处 app.MapBlazorHub(); app.MapFallbackToPage("/_Host");
验证
修改完成后,重新构建并启动项目,再次用Postman调用https://localhost:7131/api/GetApplicationNames,即可正常获取返回数据。
内容的提问来源于stack exchange,提问作者Caverman
相关产品推荐
相关产品推荐

