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

时间:2012-06-12 22:29:55

标签: asp.net asp.net-web-api

我在ApiController上有以下操作:

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

我已按如下方式配置路线:

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

在测试版中,这个工作得很好,但我刚刚更新到最新的Release Candidate,现在我看到这样的调用有错误:

  

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

为什么这不再有效?

(我想我可以摆脱{action}而只是制造大量的控制器,但这感觉很麻烦。)

11 个答案:

答案 0 :(得分:104)

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

答案 1 :(得分:52)

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

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

答案 2 :(得分:32)

虽然这不是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)
{
    ...
}

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

答案 3 :(得分:18)

如果您使用HttpGet修饰方法,请在控制器顶部添加以下using

using System.Web.Http;

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

答案 4 :(得分:14)

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

如果您想要将基于动词的动作(即“GetSomething”,“PostSomething”)与非基于动词的动作混合,则会出现问题。如果您尝试使用上述属性,则会导致与控制器中任何基于动词的操作发生冲突。获取arount的一种方法是为每个动词定义单独的路由,并将默认动作设置为动词的名称。此方法可用于在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上记录了一个问题。如果您希望看到这一点,请就此问题投票。

答案 5 :(得分:4)

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

答案 6 :(得分:4)

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

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

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

答案 7 :(得分:2)

替换此路径中的以下代码

路径:

App_Start =&gt; WebApiConfig.cs

代码:

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

答案 8 :(得分:1)

我不知道这是否与OP的帖子有关,但是我缺少[HttpGet]批注,这就是导致错误的原因,如@dinesh_ravva方法所述,默认情况下假定为HttpPost。< / p>

答案 9 :(得分:0)

我的问题很简单,因为返回的消息中没有显示空引用,所以我必须调试API才能看到它。

答案 10 :(得分:0)

运行没有SSL的查询时出现此错误。

只需将我的请求的URL方案从HTTP更改为HTTPS即可解决此问题。