Roy*_*mir 12 c# post asp.net-web-api
我有这个控制器动作:
[HttpPost]
[ActionName("aaa")]
public HttpResponseMessage aaa(Z z) //notice - no [FromBody]
{
return Request.CreateResponse(HttpStatusCode.OK, 1);
}
Run Code Online (Sandbox Code Playgroud)
在哪里Z:
public class Z
{
public string a { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是当我通过提琴手发帖时:
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
Run Code Online (Sandbox Code Playgroud)
我实际上可以看到它正在工作:

题:
如果是这样,没有[FromBody]属性它是如何工作的?我还需要/不写这个属性吗?
此外,没有编写此属性的情况是什么 - 会导致问题?
Bad*_*dri 14
绑定对于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).
另一方面,说你的行动方法是public HttpResponseMessage aaa(string a).我们现在有string,这是一个简单的类型.在这种情况下,http://localhost:11485/api/profiles/aaa?a=1没有消息正文将允许Web API正确绑定参数,而无需您指定[FromUri].现在,如果你想在这种情况下从body绑定,你需要指定public HttpResponseMessage aaa([FromBody]string a).当然,对于这个身体必须=1,因为application/x-www-form-urlencoded,没有关键的名称a.
底线 - 您的参数(简单类型或复杂类型)决定了Web API的绑定方式.要使其工作方式与默认行为不同,您需要通过FromUri或告诉FromBody.
PS.无论我上面提到的是什么,纯粹是为了好的旧的ASP.NET Web API(包括2).在ASP.NET 5.0 aka ASP.NET vNext或ASP.NET MVC 6.0中,MVC和Web API已经统一.要使它从body绑定复杂类型,您必须指定[FromBody].