Получить все зарегистрированные маршруты в ASP.NET Core

Я новичок в .NET Core. Я хочу получить список всех зарегистрированных маршрутов в ASP.NET Core. В ASP.NET MVC у нас была таблица маршрутов в System.Web.Routing, есть ли что-то эквивалентное в ASP.NET Core? Я хочу получить список маршрутов в своем действии Controller.

Ответ 1

Я создал пакет NuGet "AspNetCore.RouteAnalyzer", который предоставляет функцию для получения всей информации о маршруте.

Попробуйте, если хотите.

Использование

Консоль диспетчера пакетов

PM> Install-Package AspNetCore.RouteAnalyzer

Startup.cs

using AspNetCore.RouteAnalyzer; // Add
.....
public void ConfigureServices(IServiceCollection services)
{
    ....
    services.AddRouteAnalyzer(); // Add
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ....
    app.UseMvc(routes =>
    {
        routes.MapRouteAnalyzer("/routes"); // Add
        ....
    });
}

Обзор

Запустите проект, и вы можете получить доступ к URL /routes, чтобы просмотреть всю информацию о маршруте вашего проекта.

Ответ 2

Вы можете взять коллекцию ActionDescriptor из IActionDescriptorCollectionProvider. Там вы ищете все действия, указанные в проекте, и можете взять AttributeRouteInfo или RouteValues, содержащий всю информацию о маршрутах.

Пример:

public class EnvironmentController : Controller
{
    private readonly IActionDescriptorCollectionProvider _actionDescriptorCollectionProvider;

    public EnvironmentController(IActionDescriptorCollectionProvider actionDescriptorCollectionProvider)
    {
        _actionDescriptorCollectionProvider = actionDescriptorCollectionProvider;
    }

    [HttpGet("routes", Name = "ApiEnvironmentGetAllRoutes")]
    [Produces(typeof(ListResult<RouteModel>))]
    public IActionResult GetAllRoutes()
    {

        var result = new ListResult<RouteModel>();
        var routes = _actionDescriptorCollectionProvider.ActionDescriptors.Items.Where(
            ad => ad.AttributeRouteInfo != null).Select(ad => new RouteModel
            {
                Name = ad.AttributeRouteInfo.Name,
                Template = ad.AttributeRouteInfo.Template
            }).ToList();
        if (routes != null && routes.Any())
        {
            result.Items = routes;
            result.Success = true;
        }
        return Ok(result);
    }
}

Ответ 3

Использование Swashbuckle помогло мне.

Вам просто нужно использовать AttributeRouting на контроллерах, которые вы хотите перечислить (и на их действия)

Ответ 4

Вы также можете использовать Template = x.AttributeRouteInfo.Template из массива ActionDescriptors.Items. Вот полный код из там:

    [Route("monitor")]
    public class MonitorController : Controller {
        private readonly IActionDescriptorCollectionProvider _provider;

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

        [HttpGet("routes")]
        public IActionResult GetRoutes() {
            var routes = _provider.ActionDescriptors.Items.Select(x => new { 
               Action = x.RouteValues["Action"], 
               Controller = x.RouteValues["Controller"], 
               Name = x.AttributeRouteInfo.Name, 
               Template = x.AttributeRouteInfo.Template 
            }).ToList();
            return Ok(routes);
        }
      }

Ответ 5

Если вы не используете MVC, вызовите GetRouteData().Routers.OfType<RouteCollection>().First() для доступа к RouteCollection:

app.UseRouter(r => {
    r.MapGet("getroutes", async context => {
        var routes = context.GetRouteData().Routers.OfType<RouteCollection>().First();
        await context.Response.WriteAsync("Total number of routes: " + routes.Count.ToString() + Environment.NewLine);
        for (int i = 0; i < routes.Count; i++)
        {
            await context.Response.WriteAsync(routes[i].ToString() + Environment.NewLine);
        }               
    });
    // ...
    // other routes
});

Обязательно вызовите GetRouteData() внутри обработчика маршрута, в противном случае он возвращает ноль.

Ответ 6

Вы пытаетесь получить маршрутизатор типа RouteCollection. Чтобы получить все маршруты такого типа, вы должны называть .All() на маршрутизаторах типа RouteCollection.

Пример: var routes = RouteData.Routers.OfType<RouteCollection>().All();

Кредит: https://rimdev.io/get-registered-routes-from-an-asp.net-mvc-core-application/

Обратитесь к предыдущей статье, если .All() не работает.

Ответ 7

Я также использовал IActionDescriptorCollectionProvider, получая информацию из RouteValues.

var routes = _actionDescriptorCollectionProvider.ActionDescriptors.Items
    .Select(ad => new
    {
        Action = ad.RouteValues["action"],
        Controller = ad.RouteValues["controller"]
    }).Distinct().ToList();

Ответ 8

Составьте список маршрутов с помощью ActionDescriptor С помощью метода http (получить, опубликовать и т.д.)

[Route("")]
[ApiController]
public class RootController : ControllerBase
{
    private readonly IActionDescriptorCollectionProvider _actionDescriptorCollectionProvider;

    public RootController(IActionDescriptorCollectionProvider actionDescriptorCollectionProvider)
    {
        _actionDescriptorCollectionProvider = actionDescriptorCollectionProvider;
    }

    public RootResultModel Get()
    {
        var routes = _actionDescriptorCollectionProvider.ActionDescriptors.Items.Where(
            ad => ad.AttributeRouteInfo != null).Select(ad => new RouteModel
        {
            Name = ad.AttributeRouteInfo.Template,
            Method = ad.ActionConstraints?.OfType<HttpMethodActionConstraint>().FirstOrDefault()?.HttpMethods.First(),
            }).ToList();

        var res = new RootResultModel
        {
            Routes = routes
        };

        return res;
    }
}

Результат