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的绑定方式。 要使其与默认行为不同,您需要通过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]
。
- 可以在运行时使用代码对xsdvalidationxml吗?
- 在PresentationFramework.dll中发生了System.Windows.Markup.XamlParseException?
- ASP.NET Web API的dependency injection
- web api模型绑定到接口
- 在Asp.Net MVC Web Api中测试Controller时,ModelState.IsValid始终为true
- 如何在ASP.NET WebApi的每个请求上对JWT令牌应用自定义validation?
- WebAPI OData $跳过自定义IQueryable double应用
- 如何通过WebApi上传图像
- HttpResponseMessage的内容为JSON
- 有没有为WebAPI项目生成C#HTTPClient包装器的方法?
- 如何告诉属性使用自定义消息处理程序的基本身份validation?