我在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}而只是制造大量的控制器,但这感觉很麻烦。)
答案 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即可解决此问题。