Żądany zasób nie obsługuje metody HTTP „GET”

103

Moja trasa jest poprawnie skonfigurowana, a moje metody mają ozdobiony tag. Nadal otrzymuję komunikat „Żądany zasób nie obsługuje metody HTTP„ GET ””?

[System.Web.Mvc.AcceptVerbs("GET", "POST")]
[System.Web.Mvc.HttpGet]
public string Auth(string username, string password)
{
  // Décoder les paramètres reçue.
  string decodedUsername = username.DecodeFromBase64();
  string decodedPassword = password.DecodeFromBase64();

  return "value";
}

Oto moje trasy:

config.Routes.MapHttpRoute(
    name: "AuthentificateRoute",
    routeTemplate: "api/game/authentificate;{username};{password}",
    defaults: new { controller = "Game",
                    action = "Auth", 
                    username = RouteParameter.Optional, 
                    password = RouteParameter.Optional },
    constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
);

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { controller = "Home", id = RouteParameter.Optional }
);
Rushino
źródło

Odpowiedzi:

227

Użyj atrybutów z System.Web. Przestrzeń nazw HTTP w akcjach interfejsu WebAPI:

    [System.Web.Http.AcceptVerbs("GET", "POST")]
    [System.Web.Http.HttpGet]
    public string Auth(string username, string password)
    {...}

Powodem, dla którego to nie działa, jest to, że używasz atrybutów, które pochodzą z przestrzeni nazw MVCSystem.Web.Mvc . Klasy w System.Web.Httpprzestrzeni nazw są przeznaczone dla interfejsu WebAPI .

Maggie Ying
źródło
11
Cholera… dzięki! miałem być szalony lol, niesamowite, jak możesz tracić czas na takie małe rzeczy ..
Rushino
1
Rzeczywiście, z pewnością konieczne jest tutaj wyjaśnienie, dlaczego jest to prawidłowa odpowiedź!
Jaxidian
6
Edytowana odpowiedź z wyjaśnieniem.
Maggie Ying,
2
czy mogę określić [System.Web.Http.AcceptVerbs ("GET", "POST")] i [System.Web.Http.HttpGet] w RouteConfig.cs, więc nie muszę dodawać tego w każdym API.
Girish Gupta
8
Dlaczego musiałem to zrobić tylko w jednym z moich 10 interfejsów API dla tego projektu? Utworzyłem interfejs API dokładnie w taki sam sposób, jak w pozostałych 9 interfejsach API. Jakie to frustrujące.
Dan Beaulieu
3

po prostu użyj tego atrybutu

[System.Web.Http.HttpGet]

nie potrzebuję tej linii kodu:

[System.Web.Http.AcceptVerbs("GET", "POST")]
Kashif Faraz
źródło
3

W moim przypadku sygnatura trasy różniła się od parametru metody. Miałem id, ale akceptowałem documentId jako parametr, który spowodował problem.

[Route("Documents/{id}")]   <--- caused the webapi error
[Route("Documents/{documentId}")] <-- solved
public Document Get(string documentId)
{
  ..
}
Armando Servin
źródło
błogosławię cię :) +1
Shai Cohen
2

Miałem ten sam problem ... Miałem już 4 kontrolery działające i działające dobrze, ale kiedy dodałem ten, zwróciło to „Żądany zasób nie obsługuje metody HTTP„ GET ””. Wypróbowałem wszystko tutaj oraz w kilku innych istotnych artykułach, ale rozwiązanie było mi obojętne, ponieważ, jak wspomniał Dan B. w odpowiedzi, inne już działały dobrze.

Odszedłem na chwilę, wróciłem i od razu zdałem sobie sprawę, że kiedy dodałem kontroler, był on zagnieżdżony w klasie „Controller”, a nie w klasie „ApiController”, w której znajdowały się moje inne kontrolery. Zakładam, że wybrałem złą opcję rusztowania do zbudowania pliku .cs w programie Visual Studio. Więc dołączyłem przestrzeń nazw System.Web.Http, zmieniłem klasę nadrzędną i wszystko działa bez dodatkowych atrybutów lub routingu.

Cameron
źródło
0

Rozwiązano ten problem przez użycie http(s)podczas uzyskiwania dostępu do punktu końcowego. Trasa, do której miałem dostęp, nie była dostępna http. Więc powiedziałbym, że sprawdź protokoły, dla których trasa jest dostępna.

Marquis103
źródło