C#中[FromBody]属性的功能是什么?

L L*_*eon 2 c# asp.net-web-api

是否有[FromBody]属性的功能?我的意思是,当我以它为例时:

public async Task SetUser([FromBody]User user)

当我使用时:

public async Task SetUser(User user)

服务器获得相同的对象没有问题,所以,它是必要的设置,或者我可以毫无后顾之忧地删除它?

素不相识的!

Rob*_*don 7

User是复杂类型,因此默认情况下,服务器将尝试从请求正文中解析它.如果你有一个简单的类型 - 例如

public async Task SetUser(string userId)
Run Code Online (Sandbox Code Playgroud)

服务器将尝试通过URL绑定来解析该值.您可以通过指定来覆盖该行为

public async Task SetUser([FromBody] string userId)
Run Code Online (Sandbox Code Playgroud)

[FromBody]为了便于阅读,我通常只留下签名.


Zor*_*vat 7

有两种方法可以将参数传递给服务器 - 通过 URI,或作为请求正文的一部分。

当数据在 URI 中传递时,它们成为查询字符串 - 例如http://server.com/something?userId=5。这将由带有int userId参数的 action 方法处理。

当数据在请求正文中传递时,您将无法在 URI 中看到它们 -例如,它是http://server.com/something。然后参数作为名称-值对在请求正文中传递。

但是,为了通过body传递任何东西,必须有body,而GET请求通常没有请求正文(技术上可以有它,但我不确定它是否用于将参数传递给GET操作方法)。您通常希望参数FromBody在 POST 操作方法中使用该属性进行修饰。同样,您通常希望 GET 操作通过 URI 接收参数,这更符合 GET 方法的目的。

您可以指定FromUriFromBody来控制行为。还有一个BindModel属性可以让您定义自定义绑定。