Существующий проект имеет контроллеры, которые наследуют либо:
-
Controller
:RouteTable.Routes.MapRoute
с помощью"{controller}/{action}/{id}"
. -
ApiController
:GlobalConfiguration.Configure
и в обратном вызовеMapRoute
с"api/{controller}/{id}"
.
Все работает отлично, но мне нужно создать URL-адреса для методов действий в обоих этих типах контроллеров. Дано:
- имя или тип контроллера, который наследуется от любого из них, и
- имя метода действия
Затем со стороны веб-сайта, как я могу создать правильные URL-адреса для веб-интерфейса API?
Я использую отражение, чтобы получить действия и имена контроллеров прямо сейчас, а затем с помощью UrlHelper.Action(actionName, controllerName, routeValueDictionary)
получить правильный URL для маршрутов веб-сайтов.
Однако этот метод (конечно) генерирует URL-адреса, подобные этому для стороны WebAPI: /ApiControllerName/Get?parameter1=value
, когда это должно быть /api/ApiControllerName?parameter1=value
и отдельное знание о том, что это запрос GET.
Цель: это для страницы smoke test для веб-сайта, который использует атрибуты и отражение, чтобы решить, что делать с smoke test. Было бы неплохо иметь возможность использовать один и тот же атрибут во всем проекте, и, кроме того, было бы очень полезно использовать правильный UrlHelper
, который знает таблицы маршрутизации и может создать правильный префикс, например /api/
вместо предположения кода, возможно, ошибочно, что маршруты API были зарегистрированы с помощью api
и не, скажем, webapi
.
Обновление
После продолжения исследования я нашел метод Url.HttpRouteUrl
, который может генерировать URL WebAPI, но для этого требуется знать имя маршрута, а не имя метода действия.
Я сделал еще больше исследований по этому вопросу и не стал ближе к решению. Похоже, если вы знаете название маршрута соответствующего маршрута, вы можете легко сварить URL-адрес. Есть также некоторые возможные подсказки здесь и здесь. Но если есть несколько маршрутов для WebApi, откуда вы знаете, какой из них соответствует контроллеру и какое действие вы хотите? Было бы глупо переопределять то, что сам MVC уже делает при выборе контроллера и действий. Наверное, я мог бы создать URL-адрес из заданных параметров с помощью каждого маршрута WebApi, а затем запустить URL-адрес через его шаги (используя некоторые из приведенных выше ссылок) и посмотреть, будет ли он соответствовать желаемому контроллеру... yuck.
Там должен быть более простой способ.
Теперь мне нужно будет двигаться дальше, но здесь, чтобы надеяться, что кто-то сможет мне помочь.