Get all registered routes in ASP.NET Core
I've created the NuGet package "AspNetCore.RouteAnalyzer" that provides a feature to get all route information.
- NuGet Gallery | AspNetCore.RouteAnalyzer ... Package on NuGet Gallery
- kobake/AspNetCore.RouteAnalyzer ... Usage guide
Try it if you'd like.
Usage
Package Manager Console
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
....
});
}
Browse
Run project and you can access the url /routes
to view all route information of your project.
You can take an ActionDescriptor
collection from IActionDescriptorCollectionProvider
.
In there, you can see all actions referred to in the project and can take an AttributeRouteInfo
or RouteValues
, which contain all information about the routes.
Example:
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Infrastructure;
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);
}
}
internal class RouteModel
{
public string Name { get; set; }
public string Template { get; set; }
}
internal class ListResult<T>
{
public ListResult()
{
}
public List<RouteModel> Items { get; internal set; }
public bool Success { get; internal set; }
}
You can also use
Template = x.AttributeRouteInfo.Template
value from ActionDescriptors.Items
array. Here is a full code sample from there :
[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);
}
}
Using Swashbuckle did the trick for me.
You just need to use AttributeRouting on controllers you want to list (and on their actions)