C# WebAPI[FromBody]始终为空
我收到了这样的请求C# WebAPI[FromBody]始终为空,c#,asp.net-web-api,owin,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 Co
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)
var requestJson = JsonConvert.SerializeObject(new SomeDto() { Name = "1" });
var content = new StringContent(requestJson);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
result = client.PostAsync(baseAddress + "api/somedto", content).Result;
但是,我的Desc参数始终为空。如果我无法在WebAPI(OWIN)中使用[FromBody],我可以知道如何检索正文内容吗
很抱歉,我无法更改传入消息,因为它是由另一家公司开发的。默认情况下,Web API使用以下规则绑定参数:
- 如果参数是“简单”类型,Web API将尝试获取该值 从URI
- 简单类型包括.NET基本类型(
,int
,bool
, 等等),再加上double
,TimeSpan
,DateTime
,Guid
,以及decimal
,加上任何带有可从 绳子字符串
- 对于复杂类型,Web API尝试从消息中读取值 正文,使用媒体类型格式化程序
- 如果您在URI中有一个基元类型,或者如果您有一个复杂的
输入body,则不必添加任何属性(也不必
或[FromBody]
)[FromUri]
- 最多允许从消息体读取一个参数。所以
这是行不通的:
public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... }
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
删除描述
您可能希望对原始字符串数据执行此操作。如果使用
HTTPClient.PostAsync
,则需要使用HttpRequest
/response而不是[FromBody]
,如下所示:
[Route("value"), HttpPost]
public HttpResponseMessage Post(HttpRequestMessage value)
{
var res = value.Content.ReadAsStringAsync().Result;
return null;
}
HttpClient client = new HttpClient();
var content = new StringContent("boe");
var result = client.PostAsync(baseAddress + "api/value", content).Result;
诀窍是异步部分,您的[FromBody]
为空,因为它是一个异步post。您仍然需要从请求中读取数据
另一方面,如果需要“DTO”复杂类型,可以使用[FromBody]
结构,如下所示:
public class SomeDto
{
public string Name { get; set; }
}
[Route("somedto"), HttpPost]
public void PostDto([FromBody]SomeDto value)
{
}
你这样称呼它:
[Route("API/Event"), HttpPost]
public IHttpActionResult StationCreateWorkItem(long EventID, long UserID, int Severity,
long DeptID, string FlowTag, [FromBody] string Desc)
var requestJson = JsonConvert.SerializeObject(new SomeDto() { Name = "1" });
var content = new StringContent(requestJson);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
result = client.PostAsync(baseAddress + "api/somedto", content).Result;
最后,您可能需要使用这些:
[Route("valueparam/{value}"), HttpGet]
public void PostWithParam([FromUri]string value)
{
}
result = client.GetAsync(baseAddress + "api/valueparam/1").Result;
以及:
在我的中,我的模型有一个
Guid?
属性,我发送了一个空字符串,因此解析失败,我得到了null
感谢您提供的信息,但不幸的是,我无法更改传入的消息。因为它是由另一方完成的。我找到了另一个解决方案。我没有使用“[FromBody]string Desc”,而是改为“[FromBody]FormDataCollection Data”。并从表单体中检索所有参数。希望以后有人能推荐更好的解决方案。