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

EF Core泛型API控制器调用返回404错误问题求助

泛型控制器API调用404问题解决方案
  • 手动注册泛型控制器
    ASP.NET Core默认不会自动识别泛型控制器的实现,需要在Program.cs里手动配置注册逻辑:
builder.Services.AddControllers()
    .AddApplicationPart(typeof(tblUsersController).Assembly)
    .AddControllersAsServices();

如果有多个泛型控制器子类,可通过自定义特性提供者批量扫描:

// 自定义特性提供者
public class GenericControllerFeatureProvider : IApplicationFeatureProvider<ControllerFeature>
{
    private readonly Assembly _assembly;

    public GenericControllerFeatureProvider(Assembly assembly)
    {
        _assembly = assembly;
    }

    public void PopulateFeature(IEnumerable<ApplicationPart> parts, ControllerFeature feature)
    {
        var baseGenericType = typeof(DbController<>);
        // 筛选所有继承自DbController<>的非抽象子类
        var controllerTypes = _assembly.GetTypes()
            .Where(t => !t.IsAbstract && !t.IsGenericTypeDefinition
                        && t.BaseType != null 
                        && t.BaseType.IsGenericType 
                        && t.BaseType.GetGenericTypeDefinition() == baseGenericType);

        foreach (var type in controllerTypes)
        {
            feature.Controllers.Add(type.GetTypeInfo());
        }
    }
}

// 在Program.cs中配置
var apiAssembly = typeof(DbController<>).Assembly;
builder.Services.AddControllers()
    .AddApplicationPart(apiAssembly)
    .ConfigureApplicationPartManager(apm =>
    {
        apm.FeatureProviders.Add(new GenericControllerFeatureProvider(apiAssembly));
    });
  • 修正路由模板与控制器名称
  1. 确保泛型父类的路由配置正确,避免子类路由冲突:
[Route("api/[controller]")]
[ApiController]
public abstract class DbController<T> : ControllerBase where T : class
{
    // 通用CRUD实现
}
  1. 给子类显式指定控制器名称,避免路由生成异常:
[ControllerName("tblUsers")]
public class tblUsersController : DbController<tblUser>
{
    // 子类无需重复添加路由特性
}
  • 验证实际注册的路由端点
    可以在Program.cs中添加日志输出,确认API的实际路由是否和预期一致:
app.MapControllers();

// 输出所有注册的端点路由
var endpointDataSource = app.Services.GetRequiredService<EndpointDataSource>();
foreach (var endpoint in endpointDataSource.Endpoints.OfType<RouteEndpoint>())
{
    Console.WriteLine($"已注册路由: {endpoint.RoutePattern.RawText}");
}

如果输出的路由不是api/tblUsers,说明控制器名称识别有误,需要调整[ControllerName]特性。

  • 检查客户端服务的请求路径
    确认DbApiClientService中调用API的URL和实际注册的路由完全匹配,比如如果实际路由是api/tblUsers,客户端不能写成api/DbController。

内容的提问来源于stack exchange,提问作者ParSa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 15:18:11