ASP.NET 核心:为什么我们必须在 POST 请求期间使用 FromBodyAttribute 从 json 有效负载中提取参数?
ASP.NET Core: why must we use FromBodyAttribute to hydrate a parameter from a json payload during a POST request?
在将现有 Web API 2 应用程序移植到 ASP.NET Core 时,我注意到现在我们需要将 FromBodyAttribute
应用于操作方法的参数(POST 带有 json 负载的请求):
[HttpPost]
public IActionResult([FromBody]MyComplexType parameter){ ... }
我已经尝试搜索文档,但没有找到任何可以解释此决定背后的理由的内容。我确实找到了 post 说这样做是为了提高安全性(CSRF 场景)。
有人可以提供更多相关信息吗?
谢谢。
路易斯
默认 ComplexTypeModelBinder
根据来自请求的名称值对构建一个复杂的 object 图表。这些名称值对来自各种 IValueProvider 实现。这可以表示查询字符串、表单值、headers 或自定义源。 ASP.NET Core 的默认行为基于原始的 ASP.NET MVC 行为,其中复杂的 object 不仅由来自请求 body 的数据组成,还来自请求的各个部分。这意味着您最终可以从查询字符串以及 body.
中得到 object 中的值
为了明确说明,我们在 ASP.NET 核心 MVC 中进行了调用,要求 [FromBody] 规避此行为并直接调用 IInputFormatter 管道。
PS:在 ASP.NET Core 2.1 控制器中,装饰有 [ApiController] 属性的控制器免费获得此功能,而无需明确指定 [FromBody]。
在将现有 Web API 2 应用程序移植到 ASP.NET Core 时,我注意到现在我们需要将 FromBodyAttribute
应用于操作方法的参数(POST 带有 json 负载的请求):
[HttpPost]
public IActionResult([FromBody]MyComplexType parameter){ ... }
我已经尝试搜索文档,但没有找到任何可以解释此决定背后的理由的内容。我确实找到了 post 说这样做是为了提高安全性(CSRF 场景)。
有人可以提供更多相关信息吗?
谢谢。
路易斯
默认 ComplexTypeModelBinder
根据来自请求的名称值对构建一个复杂的 object 图表。这些名称值对来自各种 IValueProvider 实现。这可以表示查询字符串、表单值、headers 或自定义源。 ASP.NET Core 的默认行为基于原始的 ASP.NET MVC 行为,其中复杂的 object 不仅由来自请求 body 的数据组成,还来自请求的各个部分。这意味着您最终可以从查询字符串以及 body.
为了明确说明,我们在 ASP.NET 核心 MVC 中进行了调用,要求 [FromBody] 规避此行为并直接调用 IInputFormatter 管道。
PS:在 ASP.NET Core 2.1 控制器中,装饰有 [ApiController] 属性的控制器免费获得此功能,而无需明确指定 [FromBody]。