W Web API miałem klasę o podobnej budowie:
public class SomeController : ApiController
{
[WebGet(UriTemplate = "{itemSource}/Items")]
public SomeValue GetItems(CustomParam parameter) { ... }
[WebGet(UriTemplate = "{itemSource}/Items/{parent}")]
public SomeValue GetChildItems(CustomParam parameter, SomeObject parent) { ... }
}
Ponieważ mogliśmy mapować poszczególne metody, bardzo łatwo było uzyskać właściwe żądanie we właściwym miejscu. Dla podobnej klasy, która miała tylko jedną GET
metodę, ale miała również Object
parametr, z powodzeniem zastosowałem IActionValueBinder
. Jednak w przypadku opisanym powyżej pojawia się następujący błąd:
Multiple actions were found that match the request:
SomeValue GetItems(CustomParam parameter) on type SomeType
SomeValue GetChildItems(CustomParam parameter, SomeObject parent) on type SomeType
Próbuję podejść do tego problemu, zastępując ExecuteAsync
metodę, ApiController
ale jak dotąd bez powodzenia. Jakieś rady w tej sprawie?
Edycja: zapomniałem wspomnieć, że teraz próbuję przenieść ten kod na ASP.NET Web API, który ma inne podejście do routingu. Pytanie brzmi, jak sprawić, by kod działał w interfejsie API sieci Web ASP.NET?
c#
asp.net-web-api
paulius_l
źródło
źródło
Odpowiedzi:
Jest to najlepszy sposób, w jaki znalazłem obsługę dodatkowych metod GET, a także normalnych metod REST. Dodaj następujące trasy do swojej konfiguracji WebApiConfig:
Sprawdziłem to rozwiązanie z poniższą klasą testową. Udało mi się pomyślnie trafić każdą metodę w moim kontrolerze poniżej:
Sprawdziłem, że obsługuje następujące żądania:
Zauważ, że jeśli twoje dodatkowe akcje GET nie zaczynają się od „Get”, możesz chcieć dodać atrybut HttpGet do metody.
źródło
constraints: new{id=@"\d+"}
routes.MapHttpRoute("DefaultApiPut", "Api/{controller}", new {action = "Put"}, new {httpMethod = new HttpMethodConstraint(HttpMethod.Put)});
dla mojejPut
metody, w przeciwnym razie dała mi 404.Idź z tego:
Do tego:
W związku z tym możesz teraz określić, do której akcji (metody) chcesz wysłać żądanie HTTP.
wysyłanie do „http: // localhost: 8383 / api / Command / PostCreateUser” wywołuje:
a wysłanie do „http: // localhost: 8383 / api / Command / PostMakeBooking” wywołuje:
Wypróbowałem to w aplikacji usługi WEB API z własnym hostingiem i działa jak urok :)
źródło
[HttpGet]
,[HttpPost]
itp atrybuty map czasownika metody.Uważam, że atrybuty są czystsze w użyciu niż ręczne dodawanie ich za pomocą kodu. Oto prosty przykład.
Potrzebujesz tego również w swoim pliku webapiconfig
Kilka dobrych linków http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api To wyjaśnia lepiej routing. http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
źródło
config.MapHttpAttributeRoutes();
do mojej metodyWebApiConfig.cs
, aGlobalConfiguration.Configuration.EnsureInitialized();
na końcu mojejWebApiApplication.Application_Start()
metody, aby atrybuty trasy działały.config.MapHttpAttributeRoutes();
pojawi się przed wytyczeniem trasy (npconfig.Routes.MappHttpRoute(...
. PrzedMusisz zdefiniować dalsze trasy w global.asax.cs w ten sposób:
źródło
Dzięki nowszemu interfejsowi Web Api 2 korzystanie z wielu metod pobierania stało się łatwiejsze.
Jeśli parametry przekazane do
GET
metod są na tyle różne, że system routingu atrybutów rozróżnia ich typy, tak jak ma to miejsce w przypadkuint
s iGuid
s, można określić oczekiwany typ w[Route...]
atrybucieNa przykład -
Więcej informacji na temat tego podejścia można znaleźć tutaj: http://nodogmablog.bryanhogan.net/2017/02/web-api-2-controller-with-multiple-get-methods-part-2/
Inną opcją jest podanie
GET
metodom różnych tras.Zobacz tutaj, aby uzyskać więcej informacji - http://nodogmablog.bryanhogan.net/2016/10/web-api-2-controller-with-multiple-get-methods/
źródło
W ASP.NET Core 2.0 można dodać atrybut Route do kontrolera: In ASP.NET Core 2.0 you can add Route attribute to the controller:
źródło
Próbowałem użyć routingu atrybutów Web Api 2, aby umożliwić wiele metod Get i włączyłem pomocne sugestie z poprzednich odpowiedzi, ale w kontrolerze udekorowałem tylko metodę „specjalną” (przykład):
... bez również umieszczania [RoutePrefix] na górze kontrolera:
Otrzymywałem błędy informujące, że nie znaleziono trasy pasującej do przesłanego identyfikatora URI. Kiedy miałem zarówno [Route] dekorującą metodę, jak i [RoutePrefix] dekorującą kontroler jako całość, zadziałało.
źródło
Nie jestem pewien, czy znalazłeś odpowiedź, ale zrobiłem to i działa
Teraz w global.asx
źródło
Czy próbowałeś przełączyć się na WebInvokeAttribute i ustawić metodę na „GET”?
Wydaje mi się, że miałem podobny problem i przełączyłem się na jawne wskazanie, której metody (GET / PUT / POST / DELETE) oczekuje się w przypadku większości moich metod, jeśli nie wszystkich.
WebGet powinien sobie z tym poradzić, ale widziałem, że ma pewne problemy z wieloma Get znacznie mniej wielokrotnymi Get tego samego typu zwrotu.
[Edycja: nic z tego nie jest poprawne po wygaśnięciu WCF WebAPI i migracji do ASP.Net WebAPI na stosie MVC]
źródło
źródło
Alternatywa dla leniwych / pośpiesznych (Dotnet Core 2.2):
Wzywając ich:
„cześć42”
„world99”
źródło
Żaden z powyższych przykładów nie spełnił moich osobistych potrzeb. Poniżej znajduje się to, co ostatecznie zrobiłem.
Aby wykorzystać powyższe na swojej trasie, użyj:
To, co się dzieje, to rodzaj fałszerstw w metodzie, tak że ta trasa będzie pasować tylko do domyślnych metod GET, POST, PUT i DELETE. „Prawda” mówi, że chcemy sprawdzić zgodność elementów w tablicy. Gdyby to było fałszywe, powiedziałbyś, wykluczaj te w str Możesz wtedy użyć tras powyżej tej domyślnej metody, takich jak:
W powyższym zasadniczo szuka następującego adresu URL =>
http://www.domain.com/Account/Status/Active
lub czegoś podobnego.Poza tym nie jestem pewien, czy byłbym zbyt szalony. Pod koniec dnia powinno to być na zasób. Ale widzę potrzebę mapowania przyjaznych adresów URL z różnych powodów. Jestem pewien, że w miarę ewolucji Web Api pojawi się jakiś rodzaj zabezpieczenia. Jeśli czas, zbuduję trwalsze rozwiązanie i opublikuję.
źródło
new System.Web.Http.Routing.HttpMethodConstraint(HttpMethod.Get, HttpMethod.Post, HttpMethod.Put, HttpMethod.Delete)
zamiast tego.Nie mogłem sprawić, by żadne z powyższych rozwiązań routingu działało - wydaje się, że część składni uległa zmianie i nadal jestem nowy w MVC - w mgnieniu oka, chociaż stworzyłem ten naprawdę okropny (i prosty) hack, który mnie dostanie na razie - uwaga, to zastępuje metodę "public MyObject GetMyObjects (long id)" - zmieniamy typ "id" na string, a zwracany typ na object.
źródło
Jeśli masz wiele akcji w tym samym pliku, przekaż ten sam argument, np. Id do wszystkich akcji. Dzieje się tak, ponieważ akcja może tylko identyfikować Id, więc zamiast nadawać argumentowi jakąkolwiek nazwę, zadeklaruj tylko Id w ten sposób.
źródło
Prosta alternatywa
Po prostu użyj ciągu zapytania.
Wytyczanie
Kontroler
Upraszanie
Uwaga
Pamiętaj, że parametr ciągu zapytania nie powinien mieć wartości „id” ani żadnego innego parametru skonfigurowanej trasy.
źródło
Zmodyfikuj WebApiConfig i dodaj na końcu kolejne Routes.MapHttpRoute w następujący sposób:
Następnie utwórz taki kontroler:
Tak to rozwiązałem. Mam nadzieję, że komuś to pomoże.
źródło