Istniejący projekt ma sterowników, które dziedziczą z albo:Get URL z nazwami ApiController i działania, w projekcie zawierającym Kontrolery i ApiControllers
Controller
:RouteTable.Routes.MapRoute
z"{controller}/{action}/{id}"
.ApiController
:GlobalConfiguration.Configure
oraz w oddzwonieniuMapRoute
z"api/{controller}/{id}"
.
Wszystko działa dobrze, ale muszę wygenerować adresy URL dla metod działania w obu tych typach kontrolerów. Biorąc pod uwagę:
- nazwę lub typ kontrolera, która dziedziczy z jednej z nich, a
- nazwa metody działania
Wtedy od strony witryny internetowej, w jaki sposób mogę wygenerować odpowiednie adresy URL strona interfejsu API sieci?
Używam refleksji, aby uzyskać nazwy akcji i kontrolerów już teraz, a następnie poprzez użycie UrlHelper.Action(actionName, controllerName, routeValueDictionary)
otrzymuję poprawny adres URL dla tras witryny internetowej.
Jednak ta metoda (oczywiście) generuje adresy URL takie jak dla strony WebAPI: /ApiControllerName/Get?parameter1=value
, kiedy musi być /api/ApiControllerName?parameter1=value
i osobna wiedza, że jest to żądanie GET.
Cel: jest to strona z testem dymu dla strony internetowej, która używa atrybutów i refleksji, aby zdecydować, co testować. Byłoby miło móc używać tego samego atrybutu w całym projekcie, a ponadto byłoby bardzo miło móc użyć poprawnego UrlHelper
, który zna tabele routingu i może wytworzyć właściwy prefiks, taki jak /api/
, zamiast kod zakładający, być może błędnie, że trasy API zostały zarejestrowane pod numerem api
, a nie, powiedzmy, webapi
.
Aktualizacja
Po kontynuacji badań znalazłem the Url.HttpRouteUrl
method które mogą generować WebAPI adresy URL, ale wymaga to znając nazwę trasy, a nie nazwa metody działania.
Zrobiłem jeszcze więcej badań na ten temat i nie zbliżyłem się do rozwiązania. Wygląda na to, że znasz nazwę trasy odpowiedniej trasy, you can cook up a Url easily. Istnieją również pewne prawdopodobne wskazówki: here i here. Ale jeśli istnieje wiele tras dla WebApi, skąd wiadomo, który pasuje do kontrolera i działania, które chcesz? Byłoby głupie, by ponownie wprowadzić w życie to, co MVC już robi, wybierając kontroler i działanie. Myślę, że mógłbym stworzyć adres URL z podanych parametrów przy użyciu każdej trasy WebApi, a następnie uruchomić adres URL za pomocą jego kroków (używając niektórych z powyższych linków) i sprawdzić, czy pasuje do pożądanego kontrolera ... fuj.
Musi być łatwiejszy sposób.
Na razie będę musiał przejść, ale mam nadzieję, że ktoś mi pomoże.
Działa, z niewielkim wyjaśnieniem. dla 'httproute = false', należy użyć' UriHelper.Action' i przekazać nazwę metody działania jako parametr, a nie umieścić go w 'RouteValuesCollection'. Ponadto, w WebApi, jest trochę zabawy z prawidłowym odgadywaniem czasownika HTTP, ale na razie jestem usatysfakcjonowany (przekazywanie w 'action =" Get "' lub 'action =" MethodName "' po prostu wyświetla wartość zapytania). – ErikE