特定控制器C#的Api路由列表

问题描述 投票:0回答:1

我有一个控制器aController

我希望其中一个端点返回另一个端点指向的所有路由的数组。

例如,如果我有3个端点:

public class AController : Controller {

    [HttpGet("BRoute")]
    public string B(){ return "1"}

    [HttpGet("CRoute")]
    public string C(){ return "2"}

    [HttpGet("DRoute")]
    public string D(){ return "3"}

    [HttpGet("GetAllRoutes")]
    public string GetAllRoutes(){ 
        var allRoutes = typeof(AController).GetRoutes() //Does not exist
        return allRoutes //Return ["BRoute", "CRoute", "DRoute", "GetAllRoutes"]
    }
}

有这样的东西,类似于getMethods?

或者更简单的问题。有了方法的名称,我有办法获得路线吗?

c# api asp.net-core
1个回答
0
投票

您可以通过注入IActionDescriptorCollectionProvider服务找到所有操作(以及它们的路由数据和属性路由)。参见Here

在asp.net core2.1 Web API中,尝试以下代码:

public class ValuesController : Controller
{
    private readonly IActionDescriptorCollectionProvider _provider;

    public ValuesController(IActionDescriptorCollectionProvider provider)
    {
        _provider = provider;
    }

    [HttpGet("BRoute")]
    public string B() { return "1"; }

    [HttpGet("CRoute")]
    public string C() { return "2"; }

    [HttpGet("DRoute")]
    public string D() { return "3"; }

    [HttpGet("GetAllRoutes")]
    public IActionResult GetRoutes()
    {          
        ArrayList allRoutes = new ArrayList();
        foreach (var item in _provider.ActionDescriptors.Items)
        {
            var Template = item.AttributeRouteInfo.Template;
            Template = Template.Substring(Template.LastIndexOf("/") + 1);
            allRoutes.Add(Template);
        }

        return Ok(allRoutes);//Return ["BRoute", "CRoute", "DRoute", "GetAllRoutes"]
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.