2015-04-04 16 views
6

Jestem nowym Web API ... Oto moja podstawowa trasa:Czy mogę mieć wiele metod POST w interfejsie Web API z różnymi złożonymi typami parametrów?

config.Routes.MapHttpRoute(
    name: "Workitems", 
    routeTemplate: "api/{controller}/{workitemID}", 
    defaults: new { controller = "workitems", workitemID = RouteParameter.Optional } 
); 

Oto, co chciałbym mieć:

public HttpResponseMessage Post([FromBody] FolderModel theModel) 
public HttpResponseMessage Post([FromBody] DocumentModel theModel) 

Ale Web API nie znajdzie mojego druga metoda Post. Zrobiłem wiele wyszukiwania tutaj i w Google, ale nie znalazłem nic, co działa dla mnie (dobrze). Wiem, że mógłbym dodać drugi nieużywany parametr do drugiej metody - ale to za dużo z hackowania. Jeśli byłby to normalny kod C#, kompilator nie miałby problemu ze świadomością, który wybrać b/c metody mają różne sygnatury. Ale Web API nie jest wystarczająco inteligentny.

Przyjrzałem się niestandardowym ograniczeniom, ale nie wydawało się to odpowiednie. Nie mogę również używać różnych {działań}, ponieważ naruszają one restrykcje RESTful (bez RPC, tylko zasoby) dla mojego API. Nie mogę również umieścić drugiego postu na innym kontrolerze.

Jedynym sposobem stałam się to do pracy jest zawinąć zarówno FolderModel i DocumentModel w obiekcie nadrzędnym tak:

public class WorkitemCreateModel 
{ 
    public DocumentModel Document { get; set; } 
    public FolderModel Folder { get; set; } 
} 

public HttpResponseMessage Post([FromBody] WorkitemCreateModel theModel) 

Następnie mieć pojedynczy metody POST, która pobiera WorkitemCreateModel. Ale to jest odpowiedzialność dewelopera za pomocą mojego API, które muszą przekazać w WorkitemCreateModel, ale muszą tylko przekazać obiekt DocumentModel LUB obiekt FolderModel. To denerwujące zbyt b/c mój GET API może zwrócić obiekt DocumentModel lub obiekt FolderModel. Tak więc byłoby miło po prostu przekazać obiekt otrzymany od GET do POST. Ale to nie działa i muszą najpierw zawinąć go w obiekt WorkitemCreateModel.

Jakieś inne sugestie?

BTW: ta strona jest najlepsza! Znalazłem wiele odpowiedzi tutaj!

Odpowiedz

5

To może być stary post, ale dodaję to info na wszelki wypadek dla ludzi takich jak ja, którzy przybyli tu w poszukiwaniu odpowiedzi.

Krótka odpowiedź to: NIE, nie jest to możliwe.

Problem polega na sposobie routingu, zwłaszcza na części dotyczącej wyboru metody działania. Oto wyciąg z ASP .NET artykułu (https://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection)

Celem algorytmu selekcji jest, aby wybrać akcję z opisem statycznego, przed wywołaniem żadnych powiązań. Dlatego typy złożone są wykluczone z algorytmu dopasowującego.

Więc podczas dopasowywania metod działania do ścieżki, Web API uwzględnia wszystkie typy złożone w liście parametrów dla tej metody i kiedy to zrobić zarówno z Twoich metod have 0 parametry i dlatego jesteś w obliczu tego problemu .

Mam nadzieję, że to pomoże ...

Powiązane problemy