2016-08-19 100 views
2

我收到了这样的请求。WebAPI [FromBody] always null

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界面是这样的:

[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],我可以知道如何检索主体内容。我很抱歉,由于它是由其他公司开发的,我无法更改传入消息。

+0

我已经发现一个替代的解决方案。我没有使用“[FromBody]字符串描述”,而是改为“[FromBody] FormDataCollection Datas”。并从表单体中检索所有参数。希望稍后有人能推荐更好的解决方案。 –

回答

5

默认的Web API使用下列规则绑定参数:

  • 如果参数是一个“简单”的类型,网络API尝试从URI中获得的价值 。
  • 简单类型包括.NET基元类型(int,bool,double和 等等),加上TimeSpan,DateTime,Guid,十进制和字符串,以及任何带有可以从字符串转换的类型转换器的类型。
  • 对于复杂类型,Web API尝试使用媒体类型格式化程序从消息 正文中读取值。
  • 如果您在URI中有一个基本类型,或者如果您在主体中有一个复杂的 类型,那么您不必添加任何属性(不是 [FromBody]和[FromUri])。
  • 最多允许一个参数从消息体中读取。所以 这是行不通的:

公共HttpResponseMessage邮报([FromBody] INT ID,[FromBody] 字符串名称){...}

http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

https://blogs.msdn.microsoft.com/jmstall/2012/04/16/how-webapi-does-parameter-binding/

现在解决方案

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 

除去说明

+0

我在这里找到http://aspnetwebstack.codeplex.com/discussions/359687 –

+0

感谢您的信息,但不幸的是我无法更改传入的消息。因为它是由另一方完成的。 –