为什么我的ASP.NET Web API中的POST操作找不到?

10

这是我的 DefaultApi 配置:

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

[ActionName("DefaultAction")]
public HttpResponseMessage Get(string id)

[ActionName("DefaultAction")]
public HttpResponseMessage Post(MyClass obj)

为什么使用 GET 能够正常工作,但是使用 POST 却会返回一个 404 Not Found 的错误?

有任何想法或者建议吗?

编辑:

客户端 JavaScript 代码:

$.ajax({
    type: "POST",
    url: "@Url.Content("~/api/controllername")",
    data: args,
    200: function (data) {
          ......
        }
});
2个回答

9

我遇到了类似的问题,解决方法是在方法参数上添加 [FromBody],像这样:

[HttpPost]
public void PostIncreaseViewCounter([FromBody]int id)
{
}

7

一旦您在路由中添加了{action},使用方法名称前缀来确定get/post功能的“神奇”代码将不起作用。

您需要向Post(MyClass obj)方法添加[HttpPost]属性:

[HttpPost]
[ActionName("DefaultAction")]
public HttpResponseMessage Post(MyClass obj)
{
    // ...
}

// equivalent to:
[HttpPost]
public HttpResponseMessage DefaultAction(MyClass obj)
{
    // ...
}

请注意,在上述例子中,您的方法名可以用来定义操作名称,因此您可以根据您使用的路由来重新命名您的方法,而无需使用ActionName属性。


我不确定为什么你在使用 {controller}/{id}/{action},特别是当 id 是可选的时候,我不确定这是否与你的问题有关。通常我会使用 {controller}/{action}/{id}。我还建议在你的获取方法上添加 [HttpGet],因为我在另一个项目中也必须这样做。 - Timothy Walters
也不行...基本上我使用controller/id/action,因为我使用get api/controller,这很奇怪,我有一个不同的api控制器,几乎相同,一切都正常工作...肯定是某些愚蠢的问题... - Valter
也没用...基本上我使用controller/id/action,因为我使用get api/controller来获取所有内容,使用get api/controller/id来获取单个对象,使用post api/controller来创建新的内容,以及使用get api/controller/id/action来从单个请求中获取嵌套对象。例如api/request/23/getstudents或单个学生api/request/23/getstudent/3。很奇怪,我有一个不同的api控制器,它几乎相同,但一切都正常运行...这一定是某些愚蠢的问题... - Valter
我找到了问题所在...我有一个不同的地图路由,它搞砸了一些东西。 - Valter

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