Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebAPI[FromBody]始终为空_C#_Asp.net Web Api_Owin - Fatal编程技术网

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) { ... }
    
(MSDN)

(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
删除描述


您可能希望对原始字符串数据执行此操作。如果使用
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”。并从表单体中检索所有参数。希望以后有人能推荐更好的解决方案。