我正在从dotnet核心webapi调用.NET WebApi2端点。当我调试.NET WebApi2 POST 端点时,我的值始终为null。这不可能吗?
当我使用ID调用GET端点时,该ID传递没有问题。
我同时使用Postman和Fiddler进行调试。每当我将JSON对象从Postman传递到.NET WebApi2 POST 端点时,我的值就会被填充。
除了感到沮丧之外,这似乎很简单。 :,(
已更新为包含代码
dotnet核心网络api(邮递员致电)
[HttpPost]
public async Task PostAsync([FromBody] string value)
{
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var jsonObject = new JObject();
jsonObject.Add("text", "Rich");
var response = await client.PostAsJsonAsync("http://localhost:54732/api/Rich", jsonObject);
var responseResult = response.Content.ReadAsStringAsync().Result;
}
.NET WebApi2(JObject始终为空)
// POST: api/Rich
public void Post(JObject value)
{
}
答案 0 :(得分:0)
这可以归结为基本上使用JObject
。对于较早的Web Api操作,JObject
的工作仅是因为您要发布JSON,而JObject是动态的。但是,这是完全不正确的方法。您应该绑定到一个表示要发布的JSON的具体类。就是说,您可能会或可能无法在此进行任何更改,并且这不是技术上您当前问题的出处。
实际来源是您正在尝试发送JObject
,但没有按照您的实际意图进行。同样,JObject是动态的。它具有访问器来解析和访问基础JSON,但实际上并没有直接公开该JSON对象的成员。结果,如果您尝试对其进行序列化,那么您将无法获得任何可用的东西。将其传递给PostAsJsonAsync
使其被序列化。
您实际需要的是这样的东西:
var jsonObject = new { text = "Rich" };
然后,您传递给PostAsJsonAsync
的对象将是一个匿名对象,其实际成员可以序列化。
答案 1 :(得分:0)
我的“ REAL” 问题实际上是传输编码:已分块在请求标头中发送。
这是我的更正代码(dotnet核心网络API):
public async Task PostAsync([FromBody] JObject value)
{
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new
MediaTypeWithQualityHeaderValue("application/json"));
var jsonObject = new { variable1 = "Rich" };
var json = JsonConvert.SerializeObject(jsonObject);
var content = new StringContent(json, Encoding.UTF8, "application/json");
content.Headers.ContentLength = json.Length;
var response = await client.PostAsync("http://localhost:54732/api/Rich", content);
var responseResult = response.Content.ReadAsStringAsync().Result;
}
这是我的.NET WebApi2代码:
public IHttpActionResult Post([FromBody]RichTest value)
{
return Ok(value.variable1 + " done");
}
public class RichTest
{
public string variable1 { get; set; }
}
设置content.Headers.ContentLength时,将删除 Transfer-Encoding:chunked 。现在我的代码正在运行!
我仍然很好奇为什么原始PostAsJsonAsync无法正常工作...