ASP.NET Web Api:所请求的资源不支持http方法“GET”

我有一个ApiController下面的动作:

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

我已经configuration我的路线如下:

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

在testing版中,这工作得很好,但我只是更新到最新的候选版本,现在我看到这样的调用错误:

请求的资源不支持http方法“GET”。

为什么这不再工作?

(我想我可以摆脱{action},只是让一大堆控制器,但感觉凌乱。)

如果你在控制器中没有configuration任何HttpMethod,那么假设它只是RC中的HttpPost。 在testing版中,假定支持所有方法 – GET,PUT,POST和Delete。 这是从testing版到RC的小改动。 你可以使用[AcceptVerbs(“GET”,“POST”)]轻松处理多个httpmethod动作。

以上所有信息都是正确的,我还想指出System.Web.Mvc和System.Web.Http命名空间中都存在[AcceptVerbs()]批注。

如果是Web API控制器,则需要使用System.Web.Http。

虽然这不是OP的答案,但是我完全从完全不同的根本原因得到同样的错误。 所以如果这有助于其他人…

我的问题是一个错误的方法参数,导致WebAPI意外的路由请求。 我在ProgrammesController中有以下方法:

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

DELETE对… / api / programs / 3的请求没有像我期望的那样被路由到DeleteProgramme,而是到了GetProgrammeById,因为DeleteProgramme没有id的参数名称。 GetProgrammeById当然是拒绝DELETE,因为它被标记为只接受GET。

所以修复很简单:

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

一切都很好。 愚蠢的错误真的很难debugging。

这当然是从Beta到RC的变化。 在问题中提供的示例中,您现在需要使用[HttpGet]或[AcceptVerbs(“GET”)]来修饰您的操作。

如果您想要将基于动词的动作(即“GetSomething”,“PostSomething”)与基于动词的动作混合使用,则会导致问题。 如果您尝试使用上述属性,则会导致与控制器中的任何基于动词的操作发生冲突。 其中一种方法是为每个动词定义单独的路线,并将默认动作设置为动词的名称。 这种方法可以用来定义API中的子资源。 例如,以下代码支持:“/ resource / id / children”,其中id和children是可选的。

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

希望未来版本的Web API能够更好地支持这种情况。 目前在aspnetwebstack codeplex项目上login了一个问题http://aspnetwebstack.codeplex.com/workitem/184 。 如果这是你想看的东西,请在这个问题上投票。

如果您使用HttpGet装饰您的方法, HttpGet在控制器顶部添加以下内容:

 using System.Web.Http; 

如果您使用System.Web.Mvc ,则可能会出现此问题。

与上面相同的问题,但是根本差别很大。 对我来说,就是我用https重写规则击中了一个端点。 在http上点击会导致错误,按照预期使用https。

与OP具有相同的安装程序。 一个控制器与许多行动…less“凌乱”:-)

在我的情况下,我添加一个新的动作时,忘了“[HttpGet]”。

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