【问题标题】:AspNetCore WebApi ODataController Cannot Deserialize JSON PayloadAspNetCore WebApi ODataController 无法反序列化 JSON 有效负载
【发布时间】:2018-09-19 21:14:35
【问题描述】:

我无法让我的 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.* 包。

【问题讨论】:

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


    【解决方案1】:

    当数据使用 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
    

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

    1. 写两个action方法,根据不同的headers路由
    2. 自定义模型绑定器

    有关详细信息,请参阅文档here

    【讨论】:

    • 使用 FromBodyAttribute 装饰我的操作参数并不能完成任务。使用 FromBodyAttribute 时,模型实际上是 null 而不是默认实例!
    • @GregValainis 你的意思是说,如果你用 [FromBody] 属性装饰它并发送 application/json 有效负载,Github 上的项目将无法运行?
    • 正确。我相信 Microsoft.AspNetCore.OData 包中存在错误。我在 github 上打开了该项目的问题。 https://github.com/OData/WebApi/issues/1619
    • 我一定快疯了,因为我知道我曾尝试使用“FromBodyAttribute”来装饰我的操作参数,但没有得到预期的结果。然而,情况似乎不再如此。
    【解决方案2】:

    如果您正在对端点执行 HttpPost,则操作方法签名中的 FromBodyAttribute。

    例如,

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

    { .... 你的代码 }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多