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


92

我在ApiController上执行以下操作:

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

而且我的路线配置如下:

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

在测试版中,此功能运行良好,但我刚刚更新到了最新的候选版本,现在在这样的调用中看到错误:

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

为什么这不再起作用?

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

Answers:


107

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


刚刚遇到了这个问题,谢谢您的修复,但是很好奇,为什么我必须使用我的自定义方法而不是默认的“ Get”方法?我有一个由控制器的模板创建的Get方法,但未进行装饰。这只是因为约定而得名吗?
SelAromDotNet 2014年

3
@Josh:是的!当操作方法的名称以“ Get ...”开头时,您不必将其标记为GET方法。在此处了解更多信息:asp.net/web-api/overview/web-api-routing-and-actions/…–
珍妮·奥莱利

我按照答案中的建议进行了操作,但是现在我的两个呼叫(Get和Post)都被重定向到Get Action。有什么帮助吗?
Syed Ali Taqi 2015年

54

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

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


@埃里克。太棒了,这就是它对我不起作用的原因。我的动作上有动词,但它是通过Web.Mvc引用的,因此无法正常工作。
dreza

太好了,您保存了我的一天
侯赛因·纳里马尼·拉德

非常感谢,因为System.Web.Mvc对我不利。
BurakKarakuş16年

34

尽管这不是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)
{
    ...
}

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


1
如果有人使用url路由,请尝试执行[Route(“ {programmeId = programmeId:int}”)]
sree

1
这是给我的。WebApiConfig-> MapHttpRoutes具有-> routeTemplate:“ api / {controller} / {id}”,因此必须使用参数'id'。
HockeyJ

1
您的答案将我引向我的问题,这个问题与我稍有不同,我更改了该方法的一个[FromUri]参数的名称,并且未在客户端进行更新
Matus

22

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

using System.Web.Http;

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


5
这是真的,而且.NET并没有清楚地显示消息。
2016年

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


8

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

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

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

6

与上述问题相同,但根源差异很大。对我来说,那是我使用https重写规则击中了端点。在http上点击它会导致错误,该错误可通过https正常使用。


3

在此路径中替换以下代码

路径:

App_Start => WebApiConfig.cs

码:

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


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.