【发布时间】:2015-04-29 06:09:10
【问题描述】:
我们正在从 MVC 迁移到 WepApi 以提供我们的数据。这是我们如何更改控制器的示例。
MVC:
OfficeController : Controller
{
[HttpPost]
public IEnumerable<Employee> SetSalary(string badge, string salary)
{
return new List<Employee>();
}
}
WebAPI
OfficeApiController : ApiController
{
[HttpPost]
public IEnumerable<Employee> SetSalary(string badge, string salary)
{
return new List<Employee>();
}
}
我们正在从客户端发送数据,如下所示:
var data = JSON.stringify({ badge: '123', salary: '100000' });
// MVC
$.ajax({
type: 'POST',
contentType: "application/json; charset=utf-8",
dataType: 'json',
data: data,
url: 'Office/SetSalary',
});
// WebApi
$.ajax({
type: 'POST',
contentType: "application/json; charset=utf-8",
dataType: 'json',
data: data,
url: 'ActionApi/OfficeApi/SetSalary',
});
MVC 控制器工作正常;但是对于 webapi,我们收到以下消息:
{"Message":"No HTTP resource was found that matches the request URI.","MessageDetail":"No action was found on the controller 'OfficeApiController ' that matches the request."}
如果我们的帖子只有一个参数,那么 WebApi 一切正常
如果我们将徽章和薪水放在一个类中并将 post 参数更改为该类,那么一切正常。
如果我们将它们作为两个参数提交但在网络表单中,那么一切正常。
webapi 仅在我们提交 Json 并且控制器具有两个参数而不是具有这些参数作为属性的单个类时才会失败。
我们知道 WebApi 是用于 Rest 的,它应该获取/pot/delete/update 一个资源,但我不知道为什么它不能解析两个 Json 参数。
请注意,这不是我们的实际代码,而是用于提问的简化版本。可能有一些错字,但在我们的测试中一切都符合要求并运行良好。
感谢您的帮助。
【问题讨论】:
-
开箱即用,Web API 不支持 POST 正文中的多个参数。典型的解决方案是将其包装到单个类中。可以通过其他方式完成,但是 AFAIK,您需要覆盖默认的 HttpParameterBinding。
-
您可以尝试在 url 本身中为 webapi 发送参数吗? ActionApi/OfficeApi/SetSalary/{badge}/{salary}
标签: c# json asp.net-mvc asp.net-web-api