1

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

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

尽管示例错误来自 Track 控制器,但所有其他控制器都有相同的问题。

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

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

我已经尝试过使用这样的JSON对象:

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

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

track=0000&juke=0000

上面示例中的“0000”是真实身份的替代品。

可以肯定的是,我还发布了Register()from WebApiConfig.cs

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

3 回答 3

1

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

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

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

于 2015-01-21T13:31:56.537 回答
1

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

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

所以当我看到[HttpPost]你的Index行为时,在我看来 REST API 模式被打破了。

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

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

您可以在这里查看一个示例。

于 2015-01-21T13:49:03.283 回答
1

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

问题是我必须[FromBody]在动作的一个参数上使用该属性。在移动juketrack进入模型后,它终于像我希望的那样工作了。

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

于 2015-01-21T14:45:07.080 回答