MVC4 API Post 动词抛出 http 404

MVC4 API Post verb throws http 404

我正在尝试创建一个基于 Asp.Net MVC4 web api 框架的 REST api。 GET 请求工作正常。服务器将忽略所有其他动词。 它只是说以下内容:

"No action was found on the controller 'Track' that matches the request."

虽然示例错误来自 Track 控制器,但所有其他控制器都有同样的问题。

这是我尝试调用的控制器轨道上的方法:

    [HttpPost]
    public Object Index(string token, string juke, string track)
    {
    }

我试过使用 JSON 对象,如下所示:

{ "track": "0000", "juke": "0000" }

我尝试使用 "normal" 方式:

track=0000&juke=0000

上面示例中的“0000”是真实 ID 的替代。

为了确保我也发布了来自 WebApiConfig.csRegister():

public static void Register(HttpConfiguration config)
    {
        config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
        config.Routes.MapHttpRoute(
            name: "DefaultIndexBackEnd",
            routeTemplate: "back-end/{controller}/{token}",
            defaults: new { action = "Index", token = RouteParameter.Optional }
        );
        config.Routes.MapHttpRoute(
            name: "DefaultBackEnd",
            routeTemplate: "back-end/{controller}/{action}/{token}",
            defaults: new { token = RouteParameter.Optional }
        );
    }

在您的 TrackController 中试试这个。因为您使用了多个参数,所以必须将它们声明为可选的。

[HttpPost]
public Object Index(string token="", string juke="", string track="")
{
}

您可以将参数 token 设置为强制参数,因为 token 在路由配置 DefaultIndexBackEnd 中声明为可选。我认为当 POST 操作有多个参数时,使用 [FromBody] 属性是个好主意。

首先,了解典型的 REST Web API 应该如何工作很重要。通常,它针对特定操作使用不同的 HTTP 动词(GET、POST、PUT、DELETE)。

  • GET:从服务器获取实体(或集合)
  • POST: 创建一个新实体
  • PUT:更新现有实体
  • DELETE:删除现有实体

因此,当我在您的 Index 操作中看到 [HttpPost] 时,在我看来,REST API 模式已损坏。

相反,在您的控制器中,您应该有一个 Entity Get(int id) 操作(获取数据)和一个 void Post(Entity entity) 操作来创建新记录。

无需使用 HttpGetHttpPost 修饰您的操作,MVC Api 框架将根据它们的名称将请求路由到您的操作。

你可以看一个例子here

经过几个小时的尝试和研究,我终于找到 an article 准确描述了我的问题!如果您遇到同样的问题,请查看这篇文章。

问题是我必须在操作的一个参数上使用 [FromBody] 属性。将 juketrack 移入模型后,它终于如我所愿地工作了。

感谢大家的帮助,你们让我走上了正轨!