控制器操作无法从JSON读取Guid POST

时间:2016-05-24 03:14:48

标签: asp.net-mvc asp.net-web-api asp.net-core-mvc

我将Controller操作声明为:

[Route("api/person")]
[HttpPost]
public async Task<IActionResult> Person([FromBody] Guid id) { ... }

我发布的是:

POST /api/person HTTP/1.1
Host: localhost:5000
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: 747a5d76-398c-e1c7-b948-b276bb24976c

{
    "id": "b85f75d8-e6f1-405d-90f4-530af8e060d5"
}

我的操作正在受到攻击,但它收到的Guid始终为Guid.Empty值(即:它没有获得我通过它的值)。< / p>

注意,如果我使用url参数而不是[FromBody],这样可以正常工作,但我想使用http帖子的正文。

1 个答案:

答案 0 :(得分:10)

Web API documentation中所述:

  

默认情况下,Web API使用以下规则绑定参数:

     
      
  • 如果参数是“简单”类型,Web API会尝试从URI获取值。简单类型包括.NET基元类型(int,   bool,double等等,加上TimeSpan,DateTime,Guid,decimal,   和字符串,以及具有可转换的类型转换器的任何类型   一个字符串。 (稍后将详细介绍类型转换器。)
  •   
  • 对于复杂类型,Web API尝试使用媒体类型格式化程序从邮件正文中读取值。
  •   

此外,在使用[FromBody] 部分的同一篇文章中,您可以看到可以在参数上添加属性[FromBody]的示例,以便绑定请求正文中的值,就像你一样。但是这里是catch - 示例显示,在这种情况下,请求主体应该包含原始值,而不是JSON对象。

因此,在您的情况下,您有两个选择:

第一个选项是更改您的请求以提供原始值而不是JSON对象

POST /api/person HTTP/1.1
Host: localhost:5000
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: 747a5d76-398c-e1c7-b948-b276bb24976c

"b85f75d8-e6f1-405d-90f4-530af8e060d5"

第二个选项是为复杂对象提供单个属性并将其用作参数:

public class Request
{
    public Guid Id { get; set; }
}

[Route("api/person")]
[HttpPost]
public async Task<IActionResult> Person([FromBody] Request request) { ... }