99

我对 ApiController 执行了以下操作:

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

我已经将我的路线配置如下:

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

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

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

为什么这不再起作用了?

(我想我可以摆脱 {action} 并制作大量控制器,但这感觉很乱。)

4

11 回答 11

112

如果您没有在控制器中的操作上配置任何 HttpMethod,则假定它只是 RC 中的 HttpPost。在 Beta 中,假定支持所有方法 - GET、PUT、POST 和 Delete。这是从 beta 到 RC 的一个小变化。您可以使用 [AcceptVerbs("GET", "POST")] 在您的操作中轻松装饰多个 httpmethod。

于 2012-06-12T23:52:29.590 回答
55

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

如果它是 Web API 控制器,您想使用 System.Web.Http。

于 2012-07-20T22:56:44.340 回答
35

尽管这不是对 OP 的回答,但由于完全不同的根本原因,我遇到了完全相同的错误;因此,以防万一这对其他人有帮助...

对我来说,问题是一个错误命名的方法参数,它导致 WebAPI 意外地路由请求。我的 ProgrammesController 中有以下方法:

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

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

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

所以修复很简单:

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

一切都很好。确实是愚蠢的错误,但很难调试。

于 2014-01-29T10:49:10.227 回答
28

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

using System.Web.Http;

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

于 2014-06-24T10:08:26.687 回答
15

这当然是从 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上记录了一个问题。如果这是您希望看到的内容,请对该问题进行投票。

于 2012-06-28T22:43:57.397 回答
8

具有与 OP 相同的设置。一个控制器有很多动作......不那么“凌乱” :-)

就我而言,我在添加新操作时忘记了“[HttpGet]”。

[HttpGet]
public IEnumerable<string> TestApiCall()
{
    return new string[] { "aa", "bb" };
}
于 2016-07-19T10:20:03.153 回答
7

与上述相同的问题,但根源大不相同。对我来说,这是我使用 https 重写规则到达了一个端点。在 http 上点击它会导致错误,与 https 一样可以正常工作。

于 2016-04-27T16:34:16.180 回答
3

替换此路径中的以下代码

小路 :

App_Start => WebApiConfig.cs

代码:

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}/{Param}",
            defaults: new { id = RouteParameter.Optional,
                            Param = RouteParameter.Optional }
                          );
于 2018-05-20T15:47:33.593 回答
1

我不知道这是否与 OP 的帖子有关,但我错过了 [HttpGet] 注释,这就是导致错误的原因,正如@dinesh_ravva 所述,默认情况下假定方法是 HttpPost。

于 2018-10-11T12:54:14.940 回答
0

我的问题很简单,就像返回的消息中没有显示空引用一样,我必须调试我的 API 才能看到它。

于 2019-08-09T23:16:38.317 回答
0

在没有 SSL 的情况下运行查询时出现此错误。

只需将我的请求的 URL 方案从 HTTP 更改为 HTTPS 即可修复它。

于 2020-11-17T22:21:03.433 回答