Twoja mapa trasy jest prawdopodobnie taka:
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
Ale aby wykonać wiele działań przy użyciu tej samej metody http, musisz podać webapi więcej informacji na trasie:
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional });
Zauważ, że routeTemplate zawiera teraz akcję. Wiele informacji tutaj: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
Aktualizacja:
W porządku, teraz, kiedy myślę, że rozumiem, o co tu chodzi, jest jeszcze jedno podejście:
Być może nie potrzebujesz parametru url akcji i powinieneś opisać treść, której szukasz w inny sposób. Ponieważ mówisz, że metody zwracają dane z tego samego obiektu, pozwól parametrom wykonać opis za Ciebie.
Na przykład dwie metody można przekształcić w:
public HttpResponseMessage Get()
{
return null;
}
public HttpResponseMessage Get(MyVm vm)
{
return null;
}
Jakie dane przekazujesz w obiekcie MyVm? Jeśli jesteś w stanie przepuścić zmienne przez URI, sugerowałbym pójście tą drogą. W przeciwnym razie musisz wysłać obiekt w treści żądania, a to nie jest zbyt HTTP podczas wykonywania GET (choć działa, po prostu użyj [FromBody] przed MyVm).
Mam nadzieję, że to pokazuje, że możesz mieć wiele metod GET w jednym kontrolerze bez użycia nazwy akcji lub nawet atrybutu [HttpGet].
Aktualizacja od Web API 2.
Dzięki tej konfiguracji interfejsu API w pliku WebApiConfig.cs:
Możesz skierować nasz kontroler w następujący sposób:
Gdzie ControllerName to nazwa twojego kontrolera (bez „kontrolera”). Pozwoli ci to uzyskać każdą akcję ze wskazaną powyżej trasą.
Do dalszego czytania: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
źródło
W interfejsie API sieci Web (domyślnie) metody są wybierane na podstawie kombinacji metody HTTP i wartości trasy .
MyVm
wygląda jak złożony obiekt, odczytany przez program formatujący z treści, więc masz dwie identyczne metody pod względem danych trasy (ponieważ żadna z nich nie ma żadnych parametrów z trasy) - co uniemożliwia funkcji dispatcher (IHttpActionSelector
) dopasowanie odpowiedniej .Musisz je rozróżnić, używając kwerendy lub parametru trasy, aby rozwiązać niejednoznaczność.
źródło
Po wielu poszukiwaniach w sieci i próbie znalezienia najbardziej odpowiedniej formy do routingu mapy, jeśli znalazłem następujące
Te mapowania dotyczą zarówno mapowania nazw akcji, jak i podstawowej konwencji HTTP (GET, POST, PUT, DELETE)
źródło
Możliwe, że twoje metody internetowe są tłumaczone na ten sam adres URL. Spójrz na następujący link: -
http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
Może więc być konieczne dodanie nazwy metody do tabeli routingu.
źródło
Bez użycia akcji opcje byłyby następujące:
przenieś jedną z metod do innego kontrolera, aby się nie kolidowały.
użyj tylko jednej metody, która bierze parametr, a jeśli jest null, wywołaj drugą metodę z kodu.
źródło
To rozwiązanie działało dla mnie.
Najpierw umieść Route2 w WebApiConfig. Dodaj także HttpGet i HttpPost przed każdą metodą i dołącz nazwę kontrolera i nazwę metody do adresu URL.
WebApiConfig =>
Kontroler =>
Url =>
źródło
To jest odpowiedź dla każdego, kto wie, że wszystko jest poprawne i sprawdził 50 razy .....
Upewnij się, że nie patrzysz wielokrotnie
RouteConfig.cs
.Plik, który chcesz edytować, ma nazwę
WebApiConfig.cs
Ponadto prawdopodobnie powinien wyglądać dokładnie tak:
Mógłbym zaoszczędzić około 3 godzin.
źródło
Odkryłem, że gdy mam dwie metody Get, jedną bez parametrów i jedną ze złożonym typem jako parametr, otrzymuję ten sam błąd. Rozwiązałem to, dodając fikcyjny parametr typu int o nazwie Id jako mój pierwszy parametr, a następnie mój parametr typu złożonego. Następnie dodałem parametr typu złożonego do szablonu trasy. Poniższe działało dla mnie.
Najpierw zdobądź:
Drugie zdobądź:
WebApiConfig:
źródło
Jest to możliwe dzięki zastosowaniu kontrolera MVC zamiast kontrolera Web API. Sprawdź przestrzeń nazw w kontrolerze interfejsu API sieci Web, powinna ona wyglądać następująco
Jeśli przestrzeń nazw jest następująca, oznacza to, że wystąpił powyższy błąd w wywołaniu metody kontrolera interfejsu API
źródło
Sprawdź, czy masz dwie metody, które mają inną nazwę i te same parametry.
Jeśli tak, usuń jedną z metod i spróbuj.
źródło
Natknąłem się na ten problem, próbując rozszerzyć moje kontrolery WebAPI o dodatkowe działania.
Załóżmy, że tak
Istnieją teraz dwie metody, które spełniają żądanie dla / api / controller, które wyzwala problem opisany przez TS.
Nie chciałem dodawać parametrów „obojętnych” do moich dodatkowych akcji, więc sprawdziłem domyślne akcje i wymyśliłem:
dla pierwszej metody w połączeniu z „podwójnym” wiązaniem trasy:
Zauważ, że nawet jeśli w pierwszym szablonie trasy nie ma parametru „akcji”, najwyraźniej nadal możesz skonfigurować akcję domyślną, która pozwala nam oddzielić routing „normalnych” wywołań WebAPI i wywołań do dodatkowej akcji.
źródło
W moim przypadku wszystko było w porządku
1) Web Config został poprawnie skonfigurowany 2) Prefiks trasy i atrybuty trasy były prawidłowe
Nadal otrzymywałem błąd. W moim przypadku atrybut „Trasa” (naciskając F12) wskazywał na System.Web.MVc, ale nie System.Web.Http, który spowodował problem.
źródło
Możesz dodać
[Route("api/[controller]/[action]")]
do swojej klasy kontrolera.źródło
Wiem, że to stare pytanie, ale czasami, gdy używasz zasobów usług, takich jak AngularJS, do łączenia się z WebAPI, upewnij się, że używasz właściwej trasy, w przeciwnym razie ten błąd się zdarza.
źródło
Upewnij się, że NIE dekorujesz metod kontrolera dla domyślnych akcji GET | PUT | POST | DELETE atrybutem [HttpPost / Put / Get / Delete]. Dodałem ten atrybut do mojej akcji kontrolera waniliowej poczty i spowodował błąd 404.
Mam nadzieję, że to pomaga komuś, ponieważ może być bardzo frustrujące i zatrzymać postęp.
źródło
Na przykład => TestController
Jeśli możesz zmienić tylko plik WebApiConfig.cs.
Otóż to :)
I wynik:
źródło
Czy próbowałeś:
źródło
HttpGet
atrybut nie ma konstruktora, który akceptuje argument ciągu.