C# ASP.NET Core-从控制器类型获取路由

C# ASP.NET Core-从控制器类型获取路由,c#,asp.net-core,routes,C#,Asp.net Core,Routes,如何从控制器类型获取路由 例如,从某种服务或其他东西获取MyTestController和LoosedController的路径 XService.GetRoute();//输出:/api/x/MyTest XService.GetRoute();//输出:/api/松散项 [路由(“api/x/[控制器]”)] 公共抽象类MyControllerBase:ControllerBase{ [HttpGet(“{id}”)] 公共操作结果获取(int-id){ 返回Ok(id); } } [路线(

如何从控制器类型获取路由

例如,从某种服务或其他东西获取
MyTestController
LoosedController
的路径

XService.GetRoute();//输出:/api/x/MyTest

XService.GetRoute();//输出:/api/松散项

[路由(“api/x/[控制器]”)]
公共抽象类MyControllerBase:ControllerBase{
[HttpGet(“{id}”)]
公共操作结果获取(int-id){
返回Ok(id);
}
}
[路线(“api/松散项目”)]
公共类LoosedController:MyControllerBase{
}
公共类MyTestController:MyControllerBase{
[HttpGet(“操作”)]
公共行动结果查找此(){
返回Ok();
}
}

根据您的描述,您可以尝试使用
IActionDescriptorCollectionProvider
获取所有控制器路由

更多详细信息,请参考以下代码:

接口:

public interface IGetRoute
{
    IList<RouteModel> GetRotue(string type);
}
结果:


检查此项-@SSD我只有控制器类型,我必须按类型走路线。您可以使用反射逻辑检索所需内容。选中此选项-@SSD它没有用处,reflaction无法处理routeTemplate和
RouteAttribute
继承
    public GetRoute(IActionDescriptorCollectionProvider actionDescriptorCollectionProvider)
    {
        _actionDescriptorCollectionProvider = actionDescriptorCollectionProvider;
    }


    public IList<RouteModel> GetRotue(string type)
    {

        var typename = type.Replace("Controller", "");

        List<RouteModel> result = new List<RouteModel>();

        foreach (ActionDescriptor _e in _actionDescriptorCollectionProvider.ActionDescriptors.Items)
        {

            if (_e.AttributeRouteInfo != null)
            {
                if (_e.AttributeRouteInfo.Template.Contains(typename))
                {
                    result.Add(new RouteModel() { Name = _e.AttributeRouteInfo.Template, ControllerName = typename });
                }
            } else if (_e is ControllerActionDescriptor)
            {
                var e = _e as ControllerActionDescriptor;
                if (e.ControllerName == typename)
                {
                    result.Add(new RouteModel() { Name = $"/{e.ControllerName}/{e.ActionName}", ControllerName = typename });
                }

            }


        }

        return result;
    }
}
        services.AddScoped<IGetRoute, GetRoute>();
        var res = _route.GetRotue(typeof(MyTestController).Name);

        var res2 = _route.GetRotue(typeof(HomeController).Name);