Получить 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 | ОПЦИИ