Mam następującą akcję na ApiController:
public string Something()
{
return "value";
}
Skonfigurowałem moje trasy w następujący sposób:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
W wersji beta działało to dobrze, ale właśnie zaktualizowałem do najnowszej wersji Release Candidate i teraz widzę błędy w wywołaniach takich jak ten:
Żądany zasób nie obsługuje metody http „GET”.
Dlaczego to już nie działa?
(Przypuszczam, że mógłbym pozbyć się {action} i po prostu stworzyć mnóstwo kontrolerów, ale wydaje mi się, że to bałagan.)
źródło
Wszystkie powyższe informacje są poprawne, chciałbym również zwrócić uwagę, że
[AcceptVerbs()]
adnotacja istnieje zarówno w przestrzeni nazw System.Web.Mvc, jak i System.Web.Http.Chcesz użyć System.Web.Http, jeśli jest to kontroler interfejsu API sieci Web.
źródło
Chociaż nie jest to odpowiedź na PO, miałem dokładnie ten sam błąd z zupełnie innej przyczyny; więc jeśli to pomoże komuś innemu ...
Moim problemem był nieprawidłowo nazwany parametr metody, który spowodował, że WebAPI nieoczekiwanie skierowało żądanie. Mam następujące metody w moim ProgrammesController:
[HttpGet] public Programme GetProgrammeById(int id) { ... } [HttpDelete] public bool DeleteProgramme(int programmeId) { ... }
Żądania DELETE do ... / api / programy / 3 nie były kierowane do DeleteProgramme, jak się spodziewałem, ale do GetProgrammeById, ponieważ DeleteProgramme nie miało nazwy parametru id. GetProgrammeById oczywiście odrzucał wtedy DELETE, ponieważ jest oznaczony jako akceptujący tylko GET.
Więc poprawka była prosta:
[HttpDelete] public bool DeleteProgramme(int id) { ... }
I wszystko w porządku. Naprawdę głupi błąd, ale trudny do debugowania.
źródło
Jeśli dekorujesz swoją metodę za pomocą
HttpGet
, dodaj następujące elementyusing
u góry kontrolera:using System.Web.Http;
Jeśli używasz
System.Web.Mvc
, może wystąpić ten problem.źródło
To z pewnością zmiana z wersji beta na RC. W przykładzie podanym w pytaniu musisz teraz udekorować swoją akcję za pomocą [HttpGet] lub [AcceptVerbs ("GET")].
Powoduje to problem, jeśli chcesz mieszać akcje oparte na czasownikach (np. „GetSomething”, „PostSomething”) z akcjami nieopartymi na czasownikach. Jeśli spróbujesz użyć powyższych atrybutów, spowoduje to konflikt z jakąkolwiek akcją opartą na czasowniku w kontrolerze. Jednym ze sposobów uzyskania arount, które polegałoby na zdefiniowaniu oddzielnych tras dla każdego czasownika i ustawieniu domyślnej akcji na nazwę czasownika. To podejście może służyć do definiowania zasobów podrzędnych w interfejsie API. Na przykład następujący kod obsługuje: „/ zasób / id / dzieci”, gdzie id i dzieci są opcjonalne.
context.Routes.MapHttpRoute( name: "Api_Get", routeTemplate: "{controller}/{id}/{action}", defaults: new { id = RouteParameter.Optional, action = "Get" }, constraints: new { httpMethod = new HttpMethodConstraint("GET") } ); context.Routes.MapHttpRoute( name: "Api_Post", routeTemplate: "{controller}/{id}/{action}", defaults: new { id = RouteParameter.Optional, action = "Post" }, constraints: new { httpMethod = new HttpMethodConstraint("POST") } );
Miejmy nadzieję, że przyszłe wersje interfejsu API sieci Web będą lepiej obsługiwać ten scenariusz. Obecnie w projekcie aspnetwebstack codeplex zarejestrowano problem, http://aspnetwebstack.codeplex.com/workitem/184 . Jeśli jest to coś, co chciałbyś zobaczyć, zagłosuj w tej sprawie.
źródło
Mają taką samą konfigurację jak OP. Jeden kontroler z wieloma akcjami ... mniej „bałaganu” :-)
W moim przypadku zapomniałem o "[HttpGet]" podczas dodawania nowej akcji.
[HttpGet] public IEnumerable<string> TestApiCall() { return new string[] { "aa", "bb" }; }
źródło
Ten sam problem, co powyżej, ale znacznie inny root. Dla mnie chodziło o to, że trafiałem na punkt końcowy z regułą przepisywania https. Naciśnięcie go na http spowodowało błąd, działało zgodnie z oczekiwaniami z https.
źródło
Zastąp następujący kod w tej ścieżce
Ścieżka:
App_Start => WebApiConfig.cs
Kod:
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}/{Param}", defaults: new { id = RouteParameter.Optional, Param = RouteParameter.Optional } );
źródło
Nie wiem, czy może to być związane z postem OP, ale brakowało mi adnotacji [HttpGet] i to właśnie było przyczyną błędu, jak stwierdzono w metodach @dinesh_ravva, domyślnie przyjmuje się, że jest to HttpPost.
źródło
Mój problem był tak prosty, jak posiadanie zerowego odwołania, które nie pojawiło się w zwróconym komunikacie, musiałem debugować mój interfejs API, aby go zobaczyć.
źródło