C#Web API POST参数FromBody始终为null

我已经在网上搜了好几个小时,并尝试了StackOverflow上描述的许多不同的解决方案。 我之前已经问过类似的问题,但没有一个答案或评论对我有用。

问题:我有一个.NET Web API,它有一个带有一些参数的Post方法。 其中一个参数是一个复杂的对象,应该从正文中读取(即JSON)。 但是,此对象始终为null

这是我的代码:

// POST api/worksheets/post_event/true/false [Route("post_event/{newWorksheet}/{eindEvent}")] [HttpPost] public Event Post(bool newWorksheet, bool eindEvent, [FromBody] Event eventData) { return eventData; } 

要明确:eventData是始终为null的对象。 布尔值被正确读取。

完整的请求正文是:

 POST http://localhost:5000/api/worksheets/post_event/true/false Content-Type: application/json {"Persnr":1011875, "WorksheetId":null, "Projectnr":81445, "Uursoort":8678, "Tijd":{"09-08-2016 9:25"}} 

作为参考,这是Event-class:

 public class Event { public long Persnr { get; set; } public int WorksheetId { get; set; } public int Projectnr { get; set; } public int Uursoort { get; set; } public DateTime Tijd { get; set; } } 

我已经尝试过的一些事情:

  • 将JSON更改为不同的格式(仅限值,“Event”:{}围绕实际对象,a =在JSON前面)。
  • 仅使用Event参数进行测试(删除其他参数以及路径中的参数)
  • 将默认ctor添加到Event。
  • 删除[FromBody]标签。 如果我这样做,Event-object不为null,但所有属性都是。 可以通过URI填充属性,但这不是所需的行为。

根据我读过的所有解决方案和文档,它应该按照我上面显示的方式工作。 我错过了什么?

您的json对象无效。 我的建议是始终通过json解析器手动编写json对象,如下所示: http : //json.parser.online.fr/

 "Tijd":{"09-08-2016 9:25"} 

应该是

 "Tijd":["09-08-2016 9:25"] 

这种类型的正确JSON应该是正确的

 {"Persnr":1011875, "WorksheetId":null, "Projectnr":81445, "Uursoort":8678, "Tijd":"09-08-2016 9:25"} 

Tijd没有花括号,因为Tijd是普通的DateTime属性,可以从string中推断出来,代表DateTime

当您的对象无法从JSON请求反序列化时,通常会发生这种情况。

最佳做法是确保所有请求属性都可以接受null (使值类型属性可以为空 )。 然后,您可以validation是否提供了所有需要的请求属性,否则返回400错误 。 这样,您至少可以了解请求属性导致问题的原因。