【问题标题】:.net core controllers - Add [FromBody] attribute to method or not?.net 核心控制器 - 是否将 [FromBody] 属性添加到方法?
【发布时间】:2020-11-16 22:59:56
【问题描述】:

我正在开发小型网络应用程序,当涉及到控制器/端点时,我在很多人身上看到了 有些人在方法参数中添加了[FromBody] 属性,有些人没有。

我不明白这是什么意思?

示例如下:

public async Task<ActionResult> UploadImages([FromBody] ProductImagesRequestDto productImagesRequestDto)

vs 

public async Task<ActionResult> UploadImages(ProductImagesRequestDto productImagesRequestDto)

这个端点是一样的吗?

如果有...的话,这两种方法定义有什么区别?

谢谢大家

干杯

【问题讨论】:

标签: c# rest .net-core asp.net-core-webapi frombodyattribute


【解决方案1】:

不,他们不是。当您提供活页夹时,您是在说要对活页夹建模以明确查找位置和查找内容:

  • FromRoute 绑定路由数据中的值
  • FromBody 绑定请求正文中的值
  • FromQuery 绑定查询字符串中的值
  • FromForm 绑定表单字段中的值
  • FromHeader 绑定来自标头的值

如果您不提供任何活页夹,您将掌握模型活页夹的默认行为。它将在默认可用的活页夹中搜索以匹配操作参数。如果它无法匹配任何内容,则会出现模型状态错误或内容类型错误,如果据说使用FromBody binder,并且说帖子数据已使用x-www-form-urlencoded 发送。

【讨论】:

    【解决方案2】:

    参数可以通过 URI 或作为请求正文的一部分传递。

    指定 FromBody 属性只是确保参数作为请求正文的一部分而不是在 URI 中传递。

    根据传递的参数类型(以及该数据的敏感程度),将所有参数都包含在请求正文中以使其在 URI 中不可见可能被认为是最佳实践

    【讨论】:

    • 感谢您的回复,但我想知道在这个具体示例中有何不同?
    • 如果您的控制器具有 [ApiController] 属性,则根本没有区别。
    • @Neistow 有,但为什么呢?怎么会?
    • 添加该属性将控制器标记为 API 控制器,从而启用自动模型验证和参数干扰等功能,这意味着 asp net core 将尝试从可用来源猜测和绑定模型。如果来自正文,也是 afaik 默认绑定源
    • @Neistow 否,默认活页夹不是 FromBody。实际上没有单一的默认活页夹。有一个Provider List,所有的活页夹都可用。如果没有提供任何特定的活页夹,模型活页夹只会搜索最佳匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多