Я новичок в .NET Core. Я хочу получить список всех зарегистрированных маршрутов в ASP.NET Core. В ASP.NET MVC у нас была таблица маршрутов в System.Web.Routing
, есть ли что-то эквивалентное в ASP.NET Core? Я хочу получить список маршрутов в своем действии Controller.
Получить все зарегистрированные маршруты в ASP.NET Core
Ответ 1
Я создал пакет NuGet "AspNetCore.RouteAnalyzer", который предоставляет функцию для получения всей информации о маршруте.
- Галерея NuGet | AspNetCore.RouteAnalyzer... Пакет на галерее NuGet
- kobake/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;
}
}