C# MVC4API Post谓词抛出http 404
我正在尝试创建一个基于Asp.NETMVC4WebAPI框架的RESTAPI。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
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="")
{
}