ASP.NET Web Api: la ressource demandée ne prend pas en charge la méthode http ‘GET’

J’ai l’action suivante sur un ApiController:

public ssortingng Something() { return "value"; } 

Et j’ai configuré mes itinéraires comme suit:

 routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); 

Dans la version bêta, cela fonctionnait très bien, mais je viens juste de mettre à jour la dernière version Release Candidate et maintenant je vois des erreurs sur les appels comme ceci:

La ressource demandée ne prend pas en charge la méthode http ‘GET’.

Pourquoi cela ne fonctionne plus?

(Je suppose que je pourrais me débarrasser de {action} et faire une tonne de contrôleurs, mais cela semble compliqué.)

Si vous n’avez pas configuré de HttpMethod sur votre action dans le contrôleur, il est supposé être uniquement HttpPost dans RC. En bêta, il est supposé supporter toutes les méthodes – GET, PUT, POST et Delete. Ceci est un petit changement de bêta à RC. Vous pouvez facilement décoder plusieurs méthodes http sur votre action avec [AcceptVerbs (“GET”, “POST”)].

Toutes les informations ci-dessus sont correctes, je voudrais également souligner que l’ [AcceptVerbs()] existe dans les espaces de noms System.Web.Mvc et System.Web.Http.

Vous souhaitez utiliser System.Web.Http s’il s’agit d’un contrôleur d’API Web.

Bien que ce ne soit pas une réponse à l’OP, j’ai eu exactement la même erreur d’une cause complètement différente; alors au cas où cela aiderait quelqu’un d’autre …

Le problème pour moi était un paramètre de méthode nommé de manière incorrecte, qui obligeait WebAPI à acheminer la demande de manière inattendue. J’ai les méthodes suivantes dans mon programme de contrôle:

 [HttpGet] public Programme GetProgrammeById(int id) { ... } [HttpDelete] public bool DeleteProgramme(int programmeId) { ... } 

Les requêtes DELETE à … / api / programs / 3 n’étaient pas routées vers DeleteProgramme comme prévu, mais vers GetProgrammeById, car DeleteProgramme n’avait pas de nom de paramètre id. GetProgrammeById rejetait alors bien sûr DELETE car il était marqué comme n’acceptant que les GET.

Donc, le correctif était simple:

 [HttpDelete] public bool DeleteProgramme(int id) { ... } 

Et tout va bien. Erreur stupide mais difficile à déboguer.

Si vous HttpGet votre méthode avec HttpGet , ajoutez ce qui suit en using le haut du contrôleur:

 using System.Web.Http; 

Si vous utilisez System.Web.Mvc , ce problème peut se produire.

Ceci est certainement un changement de Beta à RC. Dans l’exemple fourni dans la question, vous devez maintenant décorer votre action avec [HttpGet] ou [AcceptVerbs (“GET”)].

Cela pose un problème si vous souhaitez combiner des actions basées sur des verbes (par exemple “GetSomething”, “PostSomething”) avec des actions non verbales. Si vous essayez d’utiliser les atsortingbuts ci-dessus, cela entraînera un conflit avec toute action basée sur les verbes dans votre contrôleur. Une façon d’obtenir des résultats serait de définir des routes distinctes pour chaque verbe et de définir l’action par défaut sur le nom du verbe. Cette approche peut être utilisée pour définir des ressources enfants dans votre API. Par exemple, le code suivant prend en charge: “/ resource / id / children” où id et children sont facultatifs.

  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") } ); 

Espérons que les futures versions de Web API auront un meilleur support pour ce scénario. Il y a actuellement un problème enregistré sur le projet codeplex aspnetwebstack, http://aspnetwebstack.codeplex.com/workitem/184 . Si c’est quelque chose que vous souhaiteriez voir, veuillez voter sur la question.

Même problème que ci-dessus, mais racine très différente. Pour moi, c’était que je frappais un terminal avec une règle de réécriture https. Frapper sur http a causé l’erreur, a fonctionné comme prévu avec https.

Ayez la même configuration que OP. Un contrôleur avec beaucoup d’actions … moins “désordonné” 🙂

Dans mon cas, j’ai oublié le “[HttpGet]” lors de l’ajout d’une nouvelle action.

 [HttpGet] public IEnumerable TestApiCall() { return new ssortingng[] { "aa", "bb" }; } 

Remplacez le code suivant dans ce chemin

Chemin :

App_Start => WebApiConfig.cs

Code:

 config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}/{Param}", defaults: new { id = RouteParameter.Optional, Param = RouteParameter.Optional } );