.Net 6 WebApi 路由统一添加路由前缀

本文介绍了一种在.NET 6 Web API项目中为所有控制器统一添加路由前缀的方法,通过自定义实现IApplicationModelConvention接口并结合扩展方法,简化了路由配置流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:在实际API使用时,会存在对API进行管理维护,同时,api的路由地址可能会进行分组辨认(例如前缀统一加api或者业务名称);如果对每一个控制器进行路由特性标识比较麻烦且费时间,不容易维护。

解决:可以通过统一设置路由前缀,具体步骤如下:

1. 在.net 6 WebApi项目中添加继承IApplicationModelConvention的类,实现路由前缀添加:

  public class RouteConvention : IApplicationModelConvention
    {
        private readonly AttributeRouteModel _routePrefix;
        /// <summary>
        /// 构造方法
        /// </summary>
        /// <param name="routeTemplateProvider"></param>
        public RouteConvention(IRouteTemplateProvider routeTemplateProvider)
        {
            _routePrefix = new AttributeRouteModel(routeTemplateProvider);
        }
        public void Apply(ApplicationModel application)
        {
            //遍历所有的 Controller
            foreach (var controller in application.Controllers)
            {
                // 已经标记了 RouteAttribute 的 Controller
                var matchedSelectors = controller.Selectors.Where(x => x.AttributeRouteModel != null).ToList();
                if (matchedSelectors.Any())
                {
                    foreach (var selectorModel in matchedSelectors)
                    {
                        // 在当前路由上 再 添加一个路由前缀
                        selectorModel.AttributeRouteModel = AttributeRouteModel.CombineAttributeRouteModel(_routePrefix, selectorModel.AttributeRouteModel);
                    }
                }

                // 没有标记 RouteAttribute 的 Controller
                var unmatchedSelectors = controller.Selectors.Where(x => x.AttributeRouteModel == null).ToList();
                if (unmatchedSelectors.Any())
                {
                    foreach (var selectorModel in unmatchedSelectors)
                    {
                        // 添加一个路由前缀
                        selectorModel.AttributeRouteModel = _routePrefix;
                    }
                }
            }
        }
    }

2. 添加自定义路由扩展静态类

   /// <summary>
    /// 自定义路由扩展类
    /// </summary>
    public static class MvcOptionsExtensions
    {
        /// <summary>
        /// 使用自定义路由扩展方法
        /// </summary>
        /// <param name="opts"></param>
        /// <param name="routeAttribute"></param>
        public static void UseCentralRoutePrefix(this MvcOptions opts, IRouteTemplateProvider routeAttribute)
        {
            // 添加我们自定义 实现IApplicationModelConvention的RouteConvention
            opts.Conventions.Insert(0, new RouteConvention(routeAttribute));
        }
    }

3. 在Program.cs中添加控制器时注册上述自定义扩展方法:

builder.Services.AddControllers(opt =>
{
    // 统一设置路由前缀
    opt.UseCentralRoutePrefix(new RouteAttribute("apiv2"));
});

4.这样所有控制器中的action路由前边都会加一个apiv2

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值