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.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 }
);
}
在您的 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)
操作来创建新记录。
无需使用 HttpGet
或 HttpPost
修饰您的操作,MVC Api 框架将根据它们的名称将请求路由到您的操作。
你可以看一个例子here。
经过几个小时的尝试和研究,我终于找到 an article 准确描述了我的问题!如果您遇到同样的问题,请查看这篇文章。
问题是我必须在操作的一个参数上使用 [FromBody]
属性。将 juke
和 track
移入模型后,它终于如我所愿地工作了。
感谢大家的帮助,你们让我走上了正轨!
我正在尝试创建一个基于 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.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 }
);
}
在您的 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)
操作来创建新记录。
无需使用 HttpGet
或 HttpPost
修饰您的操作,MVC Api 框架将根据它们的名称将请求路由到您的操作。
你可以看一个例子here。
经过几个小时的尝试和研究,我终于找到 an article 准确描述了我的问题!如果您遇到同样的问题,请查看这篇文章。
问题是我必须在操作的一个参数上使用 [FromBody]
属性。将 juke
和 track
移入模型后,它终于如我所愿地工作了。
感谢大家的帮助,你们让我走上了正轨!