I have several route templates like below and a lot of controllers which include several endpoints.
Project\App_Start\WebApiConfig.cs:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Code omission
config.Routes.MapHttpRoute(
name: "Template 1",
routeTemplate: "api/{controller}/{id}/action"
);
config.Routes.MapHttpRoute(
name: "Template 2",
routeTemplate: "api/master/{controller}/{id}/{history}",
defaults: new { id = RouteParameter.Optional, history = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "Default template",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
How can I get a list of all the routes (endpoints) depending on existing Controllers and their methods?
I'm expecting to get something like:
GET: api/xxx/
PUT: api/xxx/{id}
DELETE: api/xxx/{id}
PUT: api/yyy/{id}
and so on.
Update #1
I tried Charles' advice, but seems it shows only route templates
Update #2
I tried this advice.
diff --git a/Project/App_Start/WebApiConfig.cs b/Project/App_Start/WebApiConfig.cs
index 9b5a05e..6eb376f 100755
--- a/Project/App_Start/WebApiConfig.cs
+++ b/Project/App_Start/WebApiConfig.cs
@@ -1,15 +1,33 @@
namespace Project
{
+ public class ObservableDirectRouteProvider : IDirectRouteProvider
+ {
+ public IReadOnlyList<RouteEntry> DirectRoutes { get; private set; }
+
+ public IReadOnlyList<RouteEntry> GetDirectRoutes(HttpControllerDescriptor controllerDescriptor, IReadOnlyList<HttpActionDescriptor> actionDescriptors, IInlineConstraintResolver constraintResolver)
+ {
+ var defaultDirectRouteProvider = new DefaultDirectRouteProvider();
+ var directRoutes = defaultDirectRouteProvider.GetDirectRoutes(controllerDescriptor, actionDescriptors, constraintResolver);
+ DirectRoutes = DirectRoutes?.Union(directRoutes).ToList() ?? directRoutes;
+ return directRoutes;
+ }
+ }
+
/// <summary>
/// コンフィグクラス
/// </summary>
public static class WebApiConfig
{
+ public static ObservableDirectRouteProvider GlobalObservableDirectRouteProvider = new ObservableDirectRouteProvider();
/// <summary>
/// コンフィグ登録
@@ -26,7 +44,7 @@ namespace Project
config.EnableCors(cors);
- config.MapHttpAttributeRoutes();
+ config.MapHttpAttributeRoutes(GlobalObservableDirectRouteProvider)
diff --git a/Project/Global.asax.cs b/Project/Global.asax.cs
index 12bab21..afa6c5d 100644
--- a/Project/Global.asax.cs
+++ b/Project/Global.asax.cs
@@ -24,6 +25,11 @@ namespace Project
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
+ var registeredRouteList = WebApiConfig.GlobalObservableDirectRouteProvider.DirectRoutes;
+ for (int i = 0; i < registeredRouteList.Count; i++)
+ {
+ System.Diagnostics.Debug.WriteLine(registeredRouteList[i].Route.RouteTemplate);
+ }
}
I was able to get list of endpoints, but that list don't include all endpoints.
As I understand that list include endpoints, where there is explicit route attribute, for example:
[RoutePrefix("api/xxx")]
public class XXXController : ApiController
// OR
[HttpGet]
[Route("{Id}/history")]
public HttpResponseMessage Get([FromUri] int id)
But endpoints without attached RoutePrefix
or Route
has not included to the list.