Получить HTTP-метод (ы) для имени маршрута

Я хочу вывести список методов HTTP, которые пользователи могут использовать для определенного имени маршрута.

Например

[HttpGet("somethingcool",Name="name"]
public IActionResult Get(){ Ok(); }

[HttpPost("somethingcool",Name="name"]
public IActionResult Post(){ Ok(); }

Когда я пытаюсь получить методы HTTP, которые маршрутизируют name могу принять, хочу посмотреть ПОЛУЧИТЬ, ПОСТИТЬ

Есть идеи?

2 ответа

Решение

В принципе то, что вы просите сделать, невозможно. Это потому, что один маршрут может ссылаться на любое количество методов действия. Наименование маршрута также необязательно. Маршруты в первую очередь предназначены для соответствия текущему запросу, поэтому получение списка всех маршрутов, соответствующих любому возможному запросу, не является чем-то встроенным в маршрутизацию.

Но если вы используете исключительно атрибутную маршрутизацию, вы можете использовать Reflection для сканирования HttpGet а также HttpPost атрибуты в классах контроллера, а затем фильтровать список атрибутов по свойству Name.

var classes = assembly.GetTypes().Where(t => t.GetTypeInfo().IsClass && t.Name.EndsWith("Controller"));

foreach (var c in classes)
{
    var methods = c.GetMethods(BindingFlags.Public | BindingFlags.Instance);

     foreach (var method in methods)
     {
         var getAtt = method.GetCustomAttribute(typeof(HttpGetAttribute));
         var postAtt = method.GetCustomAttribute(typeof(HttpPostAttribute));

         // Check whether they are null and add metadata to your result list
     }
}

Если вы используете маршрутизацию на основе соглашений, вам необходимо пометить методы, которые ссылаются на маршруты на основе соглашений, с помощью специального атрибута, чтобы указать, какому маршруту он соответствует.

[RouteName("default")]

Затем найдите этот атрибут так же, как вы HttpGet а также HttpPost, Но вы должны быть внимательны, чтобы убедиться, что у каждого маршрута действительно есть имя, и у каждого метода есть один из возможных атрибутов для поиска, чтобы он работал.

MS предоставляет пакет NuGet для отражения вашего кода и поиска методов, поддерживаемых вашим API. Смотрите больше здесь: MSDN | Создание страниц справки для ASP.NET Web API

Тогда в вашем контроллере вы можете получить информацию от

Configuration.Services.GetApiExplorer().ApiDescriptions

Я предполагаю, что вы хотите предоставить список методов клиентам. Для этого вы должны использовать глагол OPTIONS, который создан именно для этой цели: MDN | ОПЦИИ

Другие вопросы по тегам