2012-06-12 184 views
74

我有上ApiController了以下行动:的ASP.NET Web API:请求的资源不支持HTTP方法“GET”

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

而且我已经配置了我的路线如下:

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

在测试版,这工作得很好,但我只更新到最新的发布候选,现在我看到的错误上的调用是这样的:

钍e请求的资源不支持http方法'GET'。

为什么不再工作?

(我想我可以摆脱{行动},只是做一吨的控制器,但感觉凌乱。)

回答

94

如果您还没有配置任何列举HTTPMethod在控制你的行动,则假定RC中只有HttpPost。在测试版中,假定支持所有方法 - GET,PUT,POST和Delete。这是从测试版到RC的小改变。你可以通过[AcceptVerbs(“GET”,“POST”)]轻松处理多个httpmethod动作。

+0

刚刚遇到了这个,感谢修复,但好奇,为什么我必须用我的自定义方法做到这一点,但不是默认的“Get”方法?我有一个由控制器模板创建的Get方法,但没有进行装饰。这是否仅仅是因为名字Get? – SelAromDotNet

+3

@Josh:是的!当操作方法的名称以“Get ...”开头时,您不必将其标记为GET方法。在这里阅读更多:http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api –

+0

我按照答案中的建议做了,但现在我的电话Get和Post被重定向到Get Action。请帮忙吗? –

14

这当然是从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项目http://aspnetwebstack.codeplex.com/workitem/184上记录了一个问题。如果这是您想要查看的内容,请对此问题进行投票。

51

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

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

+0

thx @Eric,我想知道为什么它不会工作... – jbl

+0

@Eric。真棒,这是它不适合我的原因。我对动作有动词,但是它通过Web.Mvc被引用,所以无法使用。 – dreza

+0

太棒了,你救了我的一天 –

25

尽管这不是对OP的回答,但我从完全不同的根本原因得到了完全相同的错误;所以如果这有助于其他人...

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

[HttpGet] 
public Programme GetProgrammeById(int id) 
{ 
    ... 
} 

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

DELETE请求.../API /程序/ 3并没有获得路由到DeleteProgramme如我所料,但GetProgrammeById,因为DeleteProgramme没有一个参数ID的名称。 GetProgrammeById当然会拒绝DELETE,因为它被标记为只接受GET。

所以修复很简单:

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

,一切都很好。愚蠢的错误真的很难调试。

14

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

using System.Web.Http; 

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

+1

这是真的,并且可笑地.NET不能清楚地显示消息。 –

2

与上面相同的问题,但根本差异很大。对我而言,我正在用https重写规则击中端点。在http上点击导致错误,按照预期的方式使用https。

2

与OP具有相同的设置。 一个控制器与许多行动......少“凌乱”:-)

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

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