MVC4 API Post动词抛出http 404

时间:2015-01-21 11:26:13

标签: c# asp.net-mvc-4 http asp.net-web-api httpverbs

我正在尝试基于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" }

我尝试使用“正常”方式:

track=0000&juke=0000

以上示例中的'0000'是真实身份的替身。

确保我还发布Register()的{​​{1}}:

WebApiConfig.cs

3 个答案:

答案 0 :(得分:1)

TrackController中尝试此操作。因为您使用多个参数,所以必须将它们声明为可选参数。

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

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

答案 1 :(得分:1)

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

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

因此,当我在[HttpPost]操作上看到Index时,我觉得REST API模式已被破坏。

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

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

您可以查看示例here

答案 2 :(得分:1)

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

问题是我必须在动作的一个参数上使用[FromBody]属性。将juketrack移到模型后,它最终按照我的希望工作。

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