AspNetCore WebApi ODataController无法反序列化JSON有效负载

时间:2018-09-19 21:14:35

标签: asp.net-core asp.net-core-mvc odata asp.net-core-webapi

我在获取V4 ODataController来反序列化JSON有效负载时遇到麻烦。我在github中创建了一个示例项目来说明我的确切问题:

https://github.com/valainisgt/BadODataDeserialization

当使用application / json的内容类型将数据提交到'/ odata / models'端点时,不会填充模型。使用完全相同的数据键和值,但是这次与application / x-www-form-urlencoded一样,填充模型。

我在这里想念什么?

编辑:

这是我的有效载荷的样子:

{ 'ModelId': 0, 'Name': "John Doe" }

这是针对.NET 462的asp.net核心应用程序。

因此,我正在使用Microsoft.AspNetCore。*软件包。

2 个答案:

答案 0 :(得分:0)

如果您对端点执行HttpPost,则

操作方法签名中的FromBodyAttribute。

例如,

public async Task<IActionResult> MyMethod([FromBody] MyPayload payload)

{.... 您的代码}

答案 1 :(得分:0)

  

当使用application / json的内容类型将数据提交到'/ odata / models'端点时,不会填充模型。使用完全相同的数据键和值,但是这次与application / x-www-form-urlencoded一样,填充模型。

  1. 如果您想接收application/json的内容类型,则需要用[FromBody]修饰模型

    public IActionResult Post([FromBody]Model m)
    

测试用例:

POST http://localhost:50317/odata/models HTTP/1.1
Content-Type: application/json

{
    ModelId:11,
    Name:"hello"
}
  1. 如果要接收x-www-form-urlencoded的内容类型,则应添加[Bind()]

    public IActionResult Post([Bind("ModelId,Name")]Model m)
    

测试用例:

POST http://localhost:50317/odata/models HTTP/1.1
Content-Type: application/x-www-form-urlencoded

ModelId=11&Name=hello

但是,没有内置的modelbinder可以绑定这两种数据类型。如果您确实想这样做,请考虑以下方法:

  1. 编写两种操作方法并根据不同的标题进行路由
  2. 自定义模型绑定器

有关更多信息,请参阅文档here