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

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;
        }
}

问题原因

  1. 路由配置冲突:控制器类上的[Route("api")]定义了基础路由前缀,但Action方法上的[Route("/GetApplicationNames")]使用了绝对路由(开头的斜杠),这会直接覆盖控制器的基础路由,导致接口实际路由为/GetApplicationNames,而非预期的/api/GetApplicationNames。
  2. 中间件顺序不规范: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:36:06