我收到了这样的请求。
POST /API/Event?EventID=15&UserID=1&Severity=5&DeptID=1&FlowTag=CE HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: localhost:8088
Content-Length: 9
Expect: 100-continue
Connection: Keep-Alive
HTTP/1.1 100 Continue
Desc=test
而我的 WebAPI 接口(interface)是这样的:
[Route("API/Event"), HttpPost]
public IHttpActionResult StationCreateWorkItem(long EventID, long UserID, int Severity,
long DeptID, string FlowTag, [FromBody] string Desc)
但是,我的 Desc 参数始终为 NULL。如果我无法在 WebAPI (OWIN) 中使用 [FromBody],请问如何检索正文内容
抱歉,我无法更改传入消息,因为它是由另一家公司开发的。
最佳答案
默认情况下,Web API 使用以下规则绑定(bind)参数:
- 如果参数是“简单”类型,Web API 会尝试获取值 来自 URI。
- 简单类型包括 .NET 原始类型(
int
、bool
、double
、 等等),加上TimeSpan
、DateTime
、Guid
、decimal
和string
,加上任何带有类型转换器的类型,可以从 字符串。 - 对于复杂类型,Web API 会尝试从消息中读取值 正文,使用媒体类型格式化程序。
- 如果您在 URI 中有一个原始类型,或者如果您有一个复杂的类型
在正文中输入,那么你不必添加任何属性(既
[FromBody]
或[FromUri]
)。 最多允许从消息正文中读取一个参数。所以 这是行不通的:
public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... }
Parameter Binding in ASP.NET Web API (MSDN)
How WebAPI does Parameter Binding (MSDN)
现在的解决方案:
POST /API/Event?EventID=15&UserID=1&Severity=5&DeptID=1&FlowTag=CE HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: localhost:8088
Content-Length: 9
Expect: 100-continue
Connection: Keep-Alive
HTTP/1.1 100 Continue
=test
removed Desc
关于c# - WebAPI [FromBody] 始终为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39030314/