La ressource demandée ne prend pas en charge la méthode HTTP 'GET'

103

Mon itinéraire est correctement configuré et mes méthodes ont la balise décorée. Je reçois toujours le message "La ressource demandée ne prend pas en charge la méthode 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";
}

Voici mes itinéraires:

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
la source

Réponses:

227

Veuillez utiliser les attributs de System.Web. Http espace de noms sur vos actions WebAPI:

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

La raison pour laquelle cela ne fonctionne pas est que vous utilisiez les attributs qui proviennent de l' espace de noms MVCSystem.Web.Mvc . Les classes de l' System.Web.Httpespace de noms sont destinées à WebAPI .

Maggie Ying
la source
11
Merde .. merci! J'étais sur le point de devenir fou lol incroyable comment vous pouvez perdre du temps sur de si petites choses ..
Rushino
1
En effet, une explication de la raison pour laquelle c'est la bonne réponse est certainement nécessaire ici!
Jaxidian
6
Réponse modifiée avec explication.
Maggie Ying
2
puis-je spécifier [System.Web.Http.AcceptVerbs ("GET", "POST")] et [System.Web.Http.HttpGet] dans RouteConfig.cs afin que je n'ai pas besoin d'ajouter cela dans chaque API.
Girish Gupta
8
Pourquoi ai-je eu besoin de le faire dans une seule de mes 10 API pour ce projet? J'ai créé l'API exactement de la même manière que dans les 9 autres API. Comme c'est frustrant.
Dan Beaulieu
3

utilisez simplement cet attribut

[System.Web.Http.HttpGet]

pas besoin de cette ligne de code:

[System.Web.Http.AcceptVerbs("GET", "POST")]
Kashif Faraz
la source
3

Dans mon cas, la signature de l'itinéraire était différente du paramètre de méthode. J'avais id, mais j'acceptais documentId comme paramètre, ce qui a causé le problème.

[Route("Documents/{id}")]   <--- caused the webapi error
[Route("Documents/{documentId}")] <-- solved
public Document Get(string documentId)
{
  ..
}
Armando Servin
la source
vous bénisse :) +1
Shai Cohen
2

J'éprouvais le même problème. J'avais déjà 4 contrôleurs en marche et fonctionnant très bien mais quand j'ai ajouté celui-ci, il a renvoyé "La ressource demandée ne supporte pas la méthode HTTP 'GET'". J'ai tout essayé ici et dans quelques autres articles pertinents, mais j'étais indifférent à la solution car, comme Dan B. l'a mentionné en réponse à la réponse, j'en avais déjà d'autres qui fonctionnaient bien.

Je suis parti un moment, je suis revenu et j'ai immédiatement réalisé que lorsque j'ai ajouté le contrôleur, il était imbriqué dans la classe "Controller" et non dans la classe "ApiController" que mes autres contrôleurs étaient sous. Je suppose que j'ai choisi la mauvaise option d'échafaudage pour créer le fichier .cs dans Visual Studio. J'ai donc inclus l'espace de noms System.Web.Http, changé la classe parente et tout fonctionne sans les attributs supplémentaires ni le routage.

Cameron
la source