C# MVC4API Post谓词抛出http 404

C# MVC4API Post谓词抛出http 404,c#,asp.net-mvc-4,http,asp.net-web-api,httpverbs,C#,Asp.net Mvc 4,Http,Asp.net Web Api,Httpverbs,我正在尝试创建一个基于Asp.NETMVC4WebAPI框架的RESTAPI。GET请求工作正常。服务器将忽略所有其他谓词。 它只是说: "No action was found on the controller 'Track' that matches the request." 虽然示例错误来自轨迹控制器,但所有其他控制器都有相同的问题 这是我试图调用的控制器轨道上的方法: [HttpPost] public Object Index(string token, stri

我正在尝试创建一个基于Asp.NETMVC4WebAPI框架的RESTAPI。
GET
请求工作正常。服务器将忽略所有其他谓词。 它只是说:

"No action was found on the controller 'Track' that matches the request."
虽然示例错误来自轨迹控制器,但所有其他控制器都有相同的问题

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

    [HttpPost]
    public Object Index(string token, string juke, string track)
    {
    }
我用一个
JSON
对象尝试了它,如下所示:

{ "track": "0000", "juke": "0000" }
我试着用“正常”的方式:

上面示例中的“0000”是真实id的代理

当然,我也在发布来自
WebApiConfig.cs
Register()

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 }
        );
    }

在您的
轨迹控制器中尝试此操作。因为您正在使用多个参数,所以必须将它们声明为可选参数

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

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

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

  • 获取:从服务器获取实体(或集合)
  • POST:创建新实体
  • PUT:更新现有实体
  • 删除:删除现有实体
因此,当我在您的
索引
操作上看到
[HttpPost]
时,我觉得restapi模式被破坏了

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

无需使用
HttpGet
HttpPost
装饰您的操作,MVC Api框架将根据请求的名称将请求路由到您的操作


你可以看一个例子

经过几个小时的尝试和研究,我终于发现这篇文章准确地描述了我的问题!如果你有同样的问题,看看这篇文章

问题是我必须对操作的一个参数使用
[FromBody]
属性。在将juke
和track移动到一个模型中之后,它终于如我所希望的那样工作了


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

您正在使用什么请求url?我正在使用:“/back-end/Track/0000”。同样,“0000”是一个真正的代币。请提供您的查看页面代码。它是web api,因此没有更多的建议而不是答案-您可以尝试通过nuget进行预览路由调试,或者我知道,这会创建一条轨迹,track参数是用于从另一个外部源创建缓存副本并将其绑定到juke的id。我将尝试
Post()
Get()
操作。
[HttpPost]
public Object Index(string token="", string juke="", string track="")
{
}