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

106

我的路由已正确配置,我的方法已添加了装饰标签,但我仍然收到“The requested resource does not support HTTP method '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";
}

以下是我的路由:

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 }
);
5个回答

236
请在您的WebAPI操作中使用System.Web.Http命名空间中的属性:
    [System.Web.Http.AcceptVerbs("GET", "POST")]
    [System.Web.Http.HttpGet]
    public string Auth(string username, string password)
    {...}

它无法工作的原因是因为您使用的属性来自MVC命名空间System.Web.Mvc。而System.Web.Http命名空间中的类是用于WebAPI


12
该说一声“该死”啊,谢谢!我快要疯了,哈哈,真不可思议,你怎么会在这些小事上浪费时间呢。 - Rushino
1
在这里确实需要解释一下为什么这是正确的答案! - Jaxidian
6
修改后的答案,附有解释。 - Maggie Ying
2
我能否在RouteConfig.cs中指定[System.Web.Http.AcceptVerbs("GET", "POST")]和[System.Web.Http.HttpGet],以便我不需要在每个API中添加它们? - Girish Gupta
8
为什么我在这个项目的10个API中只需要在其中一个API上进行此操作?我以完全相同的方式创建了该API,就像其他9个API一样。真令人沮丧。 - Dan Beaulieu
显示剩余2条评论

7

在我的情况下,路由签名与方法参数不同。我有"id",但是我接受的参数是"documentId",这导致了问题。

[Route("Documents/{id}")]   <--- caused the webapi error
[Route("Documents/{documentId}")] <-- solved
public Document Get(string documentId)
{
  ..
}

5

通过使用http(s)访问终端节点来解决此问题。 我正在访问的路由不支持http。 因此,我建议验证路由可用的协议。


3

只需使用这个属性

[System.Web.Http.HttpGet]

不需要这行代码:

[System.Web.Http.AcceptVerbs("GET", "POST")]

2
我也遇到了同样的问题。我原本有4个控制器运行得很好,但当我添加这个控制器时,它返回了“所请求的资源不支持HTTP方法'GET'”。 我尝试了此处和其他几篇相关文章中的所有方法,但由于像丹·B.在回答中提到的那样,其他控制器已经正常工作,我对解决方案感到漠不关心。
我离开了一会儿,回来后立即意识到,当我添加控制器时,它是嵌套在"Controller"类下而不是我其他控制器所在的 "ApiController" 类下。我认为我选择了错误的脚手架选项来构建Visual Studio中的.cs文件。因此,我包括了System.Web.Http命名空间,更改了父类,并且没有额外的属性或路由就使一切正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接