Получить список всех маршрутов (ASP.NET), когда атрибуты `RoutePrefix` или` Route` не используются - PullRequest
2 голосов
/ 21 ноября 2019

У меня есть несколько шаблонов маршрутов, как показано ниже, и множество контроллеров, которые включают несколько конечных точек.

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 }
        );
    }
}

Какя могу получить список всех маршрутов (конечных точек) в зависимости от существующих контроллеров и их методов?


Я ожидаю получить что-то вроде:

GET: api/xxx/
PUT: api/xxx/{id}
DELETE: api/xxx/{id}
PUT: api/yyy/{id}

и т. д. .


Обновление # 1

Я попробовал совет Чарльза, но, похоже, он показывает только шаблоны маршрутов Charles' advice


Обновление # 2

Я попробовал этот совет .

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);
+            }
         }

Мне удалось получить список конечных точек, но этот список не включает все конечные точки.
Как я понимаю, в этот список входят конечные точки, где есть явный атрибут маршрута, например:

[RoutePrefix("api/xxx")]
public class XXXController : ApiController
// OR
[HttpGet]
[Route("{Id}/history")]
public HttpResponseMessage Get([FromUri] int id)

Но конечные точки без присоединенных RoutePrefix или Route не включены в список.

Ответы [ 2 ]

0 голосов
/ 02 декабря 2019

Я не нашел способа получить список всех маршрутов (ASP.NET), когда атрибуты RoutePrefix или Route не используются, но мне помогло следующее решение.
※ Я думаю,невозможно получить правильный список всех маршрутов, когда атрибуты RoutePrefix или Route не используются.

  1. Установите пакет Microsoft.AspNet.WebApi.HelpPage.
    Инструменты → NuGetДиспетчер пакетов → Консоль диспетчера пакетов
    PW> Install-Package Microsoft.AspNet.WebApi.HelpPage
    
  2. Редактируйте Application_Start метод XXXProject \ Global.asax.cs следующим образом.
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
        AreaRegistration.RegisterAllAreas(); // ★Add this line
    }
    
  3. Редактировать Register метод XXXProject \ Areas \ HelpPage \ App_Start \ HelpPageConfig.cs следующим образом.
    public static void Register(HttpConfiguration config)
    {
        // Uncomment the following to use the documentation from XML documentation file.
        config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/App_Data/XmlDocument.xml"))); // ★Uncomment this line
    }
    
  4. Включить файл документации XML.
    Обозреватель решений → Щелкните правой кнопкой мыши на Project → Выбрать свойства → Выбрать страницу сборки
    Введите «App_Data / XmlDocument.xml» в текстовое поле. XML documentation

Атрибуты, которые вы должны использовать для получения соответствующих страниц справки ASP.NET Web API.

  1. ResponseType
    [ResponseType(typeof(MyObject))]
    public HttpResponseMessage GetMyObject()
    
  2. RoutePrefix и Route
    [RoutePrefix("api/MyController")]
    public class MyController : ApiController
    
    [Route("MyObject")]
    public HttpResponseMessage GetMyObject()
    
  3. FromUri и FromBody (необязательно)
    public HttpResponseMessage PutMyObject([FromUri] int id, [FromBody] MyObject myObject)
    

Для преобразования страниц справки ASP.NET Web APIдля статического HTML, вы можете использовать wget. Например,

wget -r -k -E http://<ip_address>/Help/

Ссылка:

0 голосов
/ 21 ноября 2019

Список маршрутов с использованием 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...