Zaczynam korzystać z projektu MVC4 Web API, mam kontroler z wieloma HttpPost
metodami. Kontroler wygląda następująco:
Kontroler
public class VTRoutingController : ApiController
{
[HttpPost]
public MyResult Route(MyRequestTemplate routingRequestTemplate)
{
return null;
}
[HttpPost]
public MyResult TSPRoute(MyRequestTemplate routingRequestTemplate)
{
return null;
}
}
Tutaj MyRequestTemplate
reprezentuje klasę szablonu odpowiedzialną za obsługę Json przechodzącą przez żądanie.
Błąd:
Kiedy wykonuję żądanie za pomocą programu Fiddler dla http://localhost:52370/api/VTRouting/TSPRoute
lub http://localhost:52370/api/VTRouting/Route
otrzymuję błąd:
Znaleziono wiele działań pasujących do żądania
Jeśli usunę jedną z powyższych metod, działa dobrze.
Global.asax
Próbowałem zmodyfikować domyślną tablicę routingu w programie global.asax
, ale nadal pojawia się błąd, myślę, że mam problem z definiowaniem tras w global.asax. Oto, co robię w global.asax.
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapHttpRoute(
name: "MyTSPRoute",
routeTemplate: "api/VTRouting/TSPRoute",
defaults: new { }
);
routes.MapHttpRoute(
name: "MyRoute",
routeTemplate: "api/VTRouting/Route",
defaults: new { action="Route" }
);
}
Wykonuję żądanie w programie Fiddler przy użyciu POST, przekazując json w RequestBody dla MyRequestTemplate.
Znacznie lepszym rozwiązaniem problemu byłoby użycie,
Route
które pozwala określić trasę w metodzie przez adnotację:źródło
Route
iTSPRoute
?posługiwać się:
nie jest to już podejście RESTful, ale możesz teraz wywoływać swoje akcje po nazwie (zamiast pozwolić, aby interfejs API sieci Web automatycznie określał je za Ciebie na podstawie czasownika) w następujący sposób:
Wbrew powszechnemu przekonaniu nie ma nic złego w tym podejściu i nie stanowi nadużycia internetowego interfejsu API. Nadal możesz korzystać ze wszystkich niesamowitych funkcji interfejsu API sieci Web (delegowanie programów obsługi, negocjowanie treści, typy mediacji itd.) - po prostu porzuć podejście RESTful.
źródło
Punkt końcowy interfejsu API sieci Web (kontroler) to pojedynczy zasób, który akceptuje czasowniki get / post / put / delete. To nie jest normalny kontroler MVC.
Koniecznie pod adresem
/api/VTRouting
może być tylko jedna metoda HttpPost, która akceptuje wysyłane parametry. Nazwa funkcji nie ma znaczenia , o ile dekorujesz materiałem [http]. Jednak nigdy nie próbowałem.Edycja: to nie działa. Podczas rozwiązywania wydaje się, że kieruje się liczbą parametrów, a nie próbuje powiązać model z typem.
Możesz przeciążać funkcje, aby akceptować różne parametry. Jestem prawie pewien, że nic by się nie stało, gdybyś zadeklarował to tak, jak robisz, ale używał innych (niekompatybilnych) parametrów niż metody. Jeśli parametry są takie same, nie masz szczęścia, ponieważ powiązanie modelu nie będzie wiedział, który z nich masz na myśli.
Ta część działa
Domyślny szablon, który podają podczas tworzenia nowego, jest dość wyraźny i powiedziałbym, że powinieneś trzymać się tej konwencji:
Jeśli chcesz stworzyć jedną klasę, która robi wiele rzeczy, do użytku Ajax, nie ma powodu, aby nie używać standardowego wzorca kontrolera / akcji. Jedyną prawdziwą różnicą jest to, że sygnatury metod nie są tak ładne i musisz je opakować,
Json( returnValue)
zanim je zwrócisz.Edytować:
Przeciążanie działa dobrze, gdy używasz standardowego szablonu (edytowanego w celu dołączenia), gdy używasz prostych typów. Poszedłem i przetestowałem również w drugą stronę, z 2 niestandardowymi obiektami z różnymi podpisami. Nigdy nie mogłem zmusić go do pracy.
To zadziałało w tym przypadku, zobacz, dokąd cię doprowadzi. Wyjątek dotyczy tylko testów.
I tak zwany z konsoli:
źródło
Istnieje możliwość dodania wielu metod pobierania i wysyłania w tym samym kontrolerze interfejsu API sieci Web. Tutaj domyślna trasa powoduje problem. Interfejs API sieci Web sprawdza dopasowanie trasy od góry do dołu, a tym samym dopasowanie domyślnej trasy dla wszystkich żądań. Domyślnie w jednym kontrolerze możliwa jest tylko jedna metoda pobierania i wysyłania. Umieść następujący kod na górze lub Skomentuj / Usuń domyślną trasę
źródło
Umieść prefiks trasy [RoutePrefix ("api / Profiles")] na poziomie kontrolera i umieść trasę w metodzie akcji [Route ("LikeProfile")]. Nie musisz niczego zmieniać w pliku global.asax
źródło
Myślę, że odpowiedź na to pytanie została już udzielona. Szukałem też czegoś, co jest kontrolerem webApi, który ma te same podpisane mehtody, ale różne nazwy. Próbowałem zaimplementować Kalkulator jako WebApi. Kalkulator ma 4 metody z tym samym podpisem, ale różnymi nazwami.
oraz w pliku WebApiConfig, który już masz
Po prostu ustaw uwierzytelnianie / autoryzację w IIS i gotowe!
Mam nadzieję że to pomoże!
źródło
Możesz użyć tego podejścia:
źródło
Nie jestem pewien, czy przeciążenie metody get / post narusza koncepcję restfull api, ale działa. Gdyby ktokolwiek mógł oświecić się w tej sprawie. Co jeśli mam URI jako
więc jak mogłeś zobaczyć mój dziennik w rodzaju agregatoot, chociaż mogę zdefiniować innego kontrolera do publikacji wyłącznie i przekazać numer identyfikacyjny publikacji w moim adresie URL, ale daje to znacznie więcej sensu. ponieważ moja publikacja nie istniałaby bez samego czasopisma.
źródło
Właśnie dodałem „action = action_name” do adresu URL i w ten sposób silnik routingu wie, jakiej akcji chcę. Dodałem również atrybut ActionName do akcji, ale nie jestem pewien, czy jest potrzebny.
źródło
Najlepsze i najprostsze wyjaśnienie, jakie widziałem na ten temat - http://www.binaryintellect.net/articles/9db02aa1-c193-421e-94d0-926e440ed297.aspx
Mam go działającego tylko z Route i nie potrzebowałem RoutePrefix.
Na przykład w kontrolerze
i
Następnie nazwa funkcji pojawia się w jquery jako -
lub
źródło