【问题标题】:ASP.NET Core: why must we use FromBodyAttribute to hydrate a parameter from a json payload during a POST request?ASP.NET Core:为什么我们必须在 POST 请求期间使用 FromBodyAttribute 来处理来自 json 有效负载的参数?
【发布时间】:2018-12-25 04:57:27
【问题描述】:

在将现有的 Web API 2 应用程序移植到 ASP.NET Core 时,我注意到现在我们需要将 FromBodyAttribute 应用于操作方法的参数(带有 json 负载的 POST 请求):

[HttpPost]
public IActionResult([FromBody]MyComplexType parameter){ ... }

我已尝试搜索文档,但没有找到任何可以解释此决定背后的理由的内容。我确实找到了一个post,它说这样做是为了提高安全性(CSRF 场景)。

有人可以提供更多信息吗?

谢谢。

路易斯

【问题讨论】:

  • 我记得在使用 webapi 2 时也想过类似的事情。这与原始/复杂类型有关。这里有一个帖子:stackoverflow.com/questions/24625303/… 和微软在这里发布:docs.microsoft.com/en-us/aspnet/web-api/overview/… - 希望对您有所帮助!
  • 你好。我正在使用 asp.net 核心。使用 web api 2,无需将 FromBody 添加到复杂的参数类型...
  • 这里是link 对 Andrew Lock 所指的 Damian 的解释。您使用的是 ASP.NET Core 2.1 吗?
  • 谢谢柯克。更详细一点,但还不够……我的意思是,基本上,它和帖子说的一样……我很想看看他们在使用“旧" 绑定方法...

标签: asp.net-core csrf model-binding


【解决方案1】:

默认的ComplexTypeModelBinder 从来自请求的名称值对构建一个复杂的对象图。这些名称值对来自各种 IValueProvider 实现。这可以表示查询字符串、表单值、标题或自定义源。 ASP.NET Core 的默认行为基于原始 ASP.NET MVC 行为,其中复杂对象不仅由请求正文中的数据组成,而且由请求的各个部分组成。这意味着您最终可能会从查询字符串和正文中获得对象中的值。

为了明确起见,我们在 ASP.NET Core MVC 中进行了调用,要求 [FromBody] 规避此行为并直接调用 IInputFormatter 管道。

PS:在 ASP.NET Core 2.1 中,使用 [ApiController] 属性装饰的控制器可以免费获得此功能,而无需显式指定 [FromBody]。

【讨论】:

  • 谢谢大卫!顺便说一句,apicontroller 是模仿您在回答开头提到的 web api2 行为还是只使用来自正文的数据?
  • 是的,它会假设复杂类型是自动的 [FromBody]。如果你有兴趣,这里是实现github.com/aspnet/Mvc/blob/…
猜你喜欢
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
相关资源
最近更新 更多