WebApi POST没有吗?

我有这个控制器动作:

[HttpPost] [ActionName("aaa")] public HttpResponseMessage aaa(Z z) //notice - no [FromBody] { return Request.CreateResponse(HttpStatusCode.OK, 1); } 

Z是:

 public class Z { public string a { get; set; } } 

但是当我通过提琴手发帖时:

 POST http://localhost:11485/api/profiles/aaa HTTP/1.1 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Host: localhost:11485 Content-Length: 3 Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.8,he;q=0.6 Cache-Control: no-cache Connection: keep-alive a=1 

我实际上可以看到它正在工作:

在此处输入图像描述

题:

如果是这样,没有[FromBody]属性它如何工作? 我还需要/不写这个属性吗?

此外,不写这个属性的情况是什么 – 会导致问题?

绑定对于MVC和Web API是不同的。 默认情况下,ASP.NET Web API将来自请求消息体的复杂类型与来自URI,查询字符串等的简单类型绑定。由于您指定了Z (一个类(复杂类型)),因此它将从body填充action方法参数你必须指定[FromBody] 。 另一方面,如果您的请求是http://localhost:11485/api/profiles/aaa?a=1没有正文,它将不会自动绑定到您的复杂参数。 在这种情况下,您需要像这样指定[FromUri]public HttpResponseMessage aaa([FromUri]Z z)

另一方面,假设你的action方法是public HttpResponseMessage aaa(string a) 。 我们现在有string ,这是一个简单的类型。 在这种情况下,没有消息体的http://localhost:11485/api/profiles/aaa?a=1将允许Web API正确绑定参数,而无需指定[FromUri] 。 现在,如果你想在这种情况下从body绑定,你需要指定public HttpResponseMessage aaa([FromBody]string a) 。 当然,对于这个body必须=1 ,对于application/x-www-form-urlencoded ,没有a的键名。

底线 – 您的参数(简单类型或复杂类型)确定Web API的绑定方式。 要使其与默认行为不同,您需要通过FromUriFromBody

PS。 无论我上面提到的是什么,纯粹是为了好的旧的ASP.NET Web API(包括2)。 在ASP.NET 5.0 aka ASP.NET vNext或ASP.NET MVC 6.0中,MVC和Web API已经统一。 要使它从body绑定复杂类型,必须指定[FromBody]