WebAPI [FromBody]始终为null

时间:2016-08-19 02:39:45

标签: c# asp.net-web-api owin

我收到了这样的请求。

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],我可以知道如何检索正文内容

抱歉,我无法更改收到的消息,因为它是由另一家公司开发的。

3 个答案:

答案 0 :(得分:7)

默认情况下,Web API使用以下规则绑定参数:

  • 如果参数是“简单”类型,则Web API会尝试获取该值 来自URI。
  • 简单类型包括.NET基元类型(int,bool,double和 所以,加上TimeSpan,DateTime,Guid,decimal和string,加上 具有可以从字符串转换的类型转换器的任何类型。
  • 对于复杂类型,Web API会尝试从邮件中读取值 正文,使用媒体类型格式化程序。
  • 如果您在URI中有原始类型,或者您有复杂的类型 键入正文然后您不必添加任何属性(不是 [FromBody]或[FromUri])。
  • 最多允许一个参数从邮件正文中读取。所以 这不起作用:
  

public HttpResponseMessage Post([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
  

删除了描述

答案 1 :(得分:0)

最后,您可能想要使用以下内容:

[Route("valueparam/{value}"), HttpGet]
public void PostWithParam([FromUri]string value)
{
}
result = client.GetAsync(baseAddress + "api/valueparam/1").Result;

[Route("valueparamfrombody"), HttpPost]
public void PostWithParam2([FromBody] JObject value1)
{
}


var req = new
{
   value1 = "1"
};
var obj = JsonConvert.SerializeObject(req);
content = new StringContent(obj);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");            
result = client.PostAsync(baseAddress + "api/valueparamfrombody", content).Result;

答案 2 :(得分:0)

在我的 case 中,我的模型有一个 Guid? 属性,我发送了一个空字符串,因此解析失败并得到 null