【问题标题】:MVC4 API Post verb throws http 404MVC4 API Post 动词抛出 http 404
【发布时间】:2015-03-19 21:43:26
【问题描述】:

我正在尝试创建一个基于 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”是真实身份的替代品。

为了确保我也发布了来自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 }
        );
    }

【问题讨论】:

  • 您使用的是什么请求网址?
  • 我正在使用:“/back-end/Track/0000”。同样,“0000”是真实令牌的替代品。
  • 请提供您的查看页面代码。
  • 是web api所以没有view
  • 更多的是建议而不是答案 - 您可以尝试通过 nuget 或 getglimpse.com 进行路线调试

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    首先,了解典型的 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

    【讨论】:

    • 我知道,它的作用是创建一个轨道,轨道参数是一个 id,用于从另一个外部源创建一个缓存副本并将其绑定到一个 juke。我会尝试Post()Get() 操作。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-11-10
      • 1970-01-01
      • 2016-04-26
      • 2017-09-23
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      相关资源
      最近更新 更多