.NetCore获取所有路由

1、通过 ApplicationPartManager 获取

    public class HomeController : ControllerBase
    {
        private ApplicationPartManager _applicationPartManager;

        public HomeController(ApplicationPartManager applicationPartManager)
        {
            _applicationPartManager = applicationPartManager;
        }
        /// 
        /// 获取路由
        /// 
        /// 
        [HttpGet("route")]
        public IActionResult Get()
        {
            var controllerFeature = new ControllerFeature();
            _applicationPartManager.PopulateFeature(controllerFeature);
            var data = controllerFeature.Controllers.Select(x => new
            {
                Namespace = x.Namespace,
                Controller = x.FullName,
                ModuleName = x.Module.Name,
                Actions = x.DeclaredMethods.Where(m => m.IsPublic && !m.IsDefined(typeof(NonActionAttribute))).Select(y => new
                {
                    Name = y.Name,
                    ParameterCount = y.GetParameters().Length,
                    Parameters = y.GetParameters()
                      .Select(z => new
                      {
                          z.Name,
                          z.ParameterType.FullName,
                          z.Position
                      })
                }),
            });
            return Ok(data);
        }
    }

总结:可以获取所有注册的Controller,不方便获取路由信息

2、通过 IActionDescriptorCollectionProvider 获取

public class HomeController : ControllerBase
    {
        private readonly IActionDescriptorCollectionProvider _actionDescriptorCollectionProvider;

        public HomeController(IActionDescriptorCollectionProvider actionDescriptorCollectionProvider)
        {
            _actionDescriptorCollectionProvider = actionDescriptorCollectionProvider;
        }
        /// 
        /// 获取路由
        /// 
        /// 
        [HttpGet("route")]
        public IActionResult Get()
        {
            var routes = _actionDescriptorCollectionProvider.ActionDescriptors.Items.Select(x => new
            {
                Action = x.RouteValues["Action"],
                Controller = x.RouteValues["Controller"],
                Name = x.AttributeRouteInfo.Name,
                Method = x.ActionConstraints?.OfType().FirstOrDefault()?.HttpMethods.First(),
                Template = x.AttributeRouteInfo.Template
            }).ToList();
            return Ok(routes);
        }
    }

总结:可以获取所有注册的Controller和路由,但是缺少summary注释信息

3、通过 SwaggerGenerator 获取

    public class HomeController : Controller
    {
        private readonly SwaggerGenerator _swaggerGenerator;
        public HomeController(SwaggerGenerator swaggerGenerator)
        {
            _swaggerGenerator = swaggerGenerator;
        }

        /// 
        /// 获取路由列表
        /// 
        /// 
        [HttpGet("route")]
        public IActionResult ListRoute()
        {
            var list = _swaggerGenerator.GetSwagger("v1");
            List paths = new List();
            foreach (var item in list.Paths)
            {
                if (item.Value.Operations != null && item.Value.Operations.Count > 0)
                {
                    foreach (var operation in item.Value.Operations)
                    {
                        paths.Add(new
                        {
                            Controller = operation.Value.Tags.FirstOrDefault()?.Name,
                            Path = item.Key,
                            HttpMethod = operation.Key.ToString(),
                            Summary = operation.Value.Summary
                        });
                    }

                }
            }
            return Ok(paths);
        }
    }

参考链接:

c# — 获取ASP.NET Core中所有已注册的路由

在ASPNETCORE中获得所有Action - 一个大西瓜咚咚咚 - 博客园

基于.NetCore3.1搭建项目系列 —— 使用Swagger导出文档 (番外篇) - Net Core教程 - 找一找教程网

你可能感兴趣的:(C#,Net,.netcore,c#)