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

FastEndpoints能否将Group前缀配置在Version前缀之前?

问题

是否可配置FastEndpoints框架,使Group路由前缀置于Version路由前缀之前?若不支持,是否有相关改进计划?

目前我有Web和移动端两类端点,移动端端点配置Group<MobileGroup>(),Web端配置Group("web"),同时指定Version("1"),并在Program类中做了如下配置:

app.UseFastEndpoints(config =>
{
        config.Endpoints.RoutePrefix = "api";
        config.Versioning.Prefix = "v";
        config.Versioning.DefaultVersion = 1;
        config.Versioning.PrependToRoute = true;
}

最终生成的路由中Version前缀在Group前缀之前,希望将Version前缀放在Group前缀之后。目前只能在每个端点的Configure()中手动指定RoutePrefixOverride("api/mobile")来规避问题,端点配置代码如下:

public override void Configure()
{
  Get("test");
  Version(1);
  AllowAnonymous();
  //RoutePrefixOverride("api/mobile"); //I'd like to do without it. 
  Group<MobileGroup>(); //will be placed after the version prefix !!!
}


public sealed class MobileGroup : Group
{
    public MobileGroup()
    {
        Configure("mobile", _ => {});
    }
}
回答

目前FastEndpoints框架不支持直接配置让Group前缀置于Version前缀之前,框架默认的路由生成逻辑是先拼接版本前缀,再拼接组前缀。

关于改进计划:截至当前版本,官方尚未将此需求列入公开的roadmap中。若需要推动该功能落地,可通过框架的代码仓库提交Feature Request,详细说明业务场景和需求。

现有无需每个端点手动写RoutePrefixOverride的替代方案:

  • 方案一:在组配置中统一指定包含版本的前缀,同时关闭全局版本前缀自动拼接

    1. 修改Program中的版本配置,关闭自动前置版本前缀:
      app.UseFastEndpoints(config =>
      {
              config.Endpoints.RoutePrefix = "api";
              config.Versioning.Prefix = "v";
              config.Versioning.DefaultVersion = 1;
              config.Versioning.PrependToRoute = false;
      }
      
    2. 在Group类中直接配置带版本的前缀:
      public sealed class MobileGroup : Group
      {
          public MobileGroup()
          {
              Configure("mobile/v1", _ => {});
          }
      }
      
      这样生成的路由就是api/mobile/v1/test,符合需求。
  • 方案二:自定义路由格式化逻辑
    通过实现IRouteFormatter接口,重写路由拼接顺序,让组前缀先于版本前缀拼接。示例代码大致如下:

    public class CustomRouteFormatter : IRouteFormatter
    {
        public string Format(EndpointDefinition ep)
        {
            var parts = new List<string>();
            // 添加全局路由前缀
            if (!string.IsNullOrEmpty(ep.RoutePrefix))
                parts.Add(ep.RoutePrefix);
            // 添加组前缀
            if (!string.IsNullOrEmpty(ep.GroupPrefix))
                parts.Add(ep.GroupPrefix);
            // 添加版本前缀(如果启用)
            if (ep.Version != null && ep.Version.PrependToRoute)
                parts.Add($"{ep.Version.Prefix}{ep.Version.Number}");
            // 添加端点路由
            parts.Add(ep.Route);
            return string.Join("/", parts);
        }
    }
    

    然后在Program中注册自定义格式化器:

    app.UseFastEndpoints(config =>
    {
        // 其他配置保持不变
        config.Endpoints.RouteFormatter = new CustomRouteFormatter();
    });
    

    注意:自定义路由格式化器需要适配框架的版本逻辑,确保版本号能正确读取和处理。

内容的提问来源于stack exchange,提问作者Нуркен Зулпыхаров

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 10:52:15