dotnet core webapi调用.net webapi2
Posted
技术标签:
【中文标题】dotnet core webapi调用.net webapi2【英文标题】:dotnet core webapi calling .net webapi2 【发布时间】:2018-10-05 20:17:22 【问题描述】:我正在从 dotnet 核心 webapi 调用 .NET WebApi2 端点。当我调试到 .NET WebApi2 POST 端点时,我的值始终为空。这不可能吗?
当我使用 ID 调用 GET 端点时,ID 会顺利传递。
我同时使用 Postman 和 Fiddler 进行调试。每当我将我的 JSON 对象从 Postman 传递到 .NET WebApi2 POST 端点时,我的 值就会被填充。
除了沮丧之外,这看起来很简单。 :,(
已更新以包含代码
dotnet core web api(从 Postman 调用)
[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)
【问题讨论】:
值得同时包含您在 ASP.NET Core 项目中使用的代码和您使用 Postman 发出的请求示例。如果没有这些信息,将很难提供帮助。 请将您的代码包含为minimal reproducible example,以便我们提供更多帮助。没有代码很难提供任何分析:-) 请在此处包含其他人指出的代码示例和您尝试过的内容。 【参考方案1】:这归结为基本上使用JObject
。对于您较旧的 Web Api 操作,JObject
仅因为您发布 JSON,而 JObject 是动态的。然而,这是一种完全错误的做法。您应该绑定到代表正在发布的 JSON 的具体类。也就是说,您可能无法更改那里的任何内容,而且它技术上不是您当前问题的根源。
实际来源是您正试图发送JObject
,这并没有按照您的想法进行。同样,JObject 是动态的。它具有解析和访问底层 JSON 的访问器,但它实际上并不直接公开该 JSON 对象的成员。结果,如果您尝试对其进行序列化,您将无法从中获得任何可用的信息。将它传递给PostAsJsonAsync
会导致它被序列化。
你真正需要的是这样的:
var jsonObject = new text = "Rich" ;
然后,您传递给PostAsJsonAsync
的将是一个匿名对象具有可以序列化的实际成员。
【讨论】:
感谢您的回复。你的建议没有奏效。我什至在 .NET WebApi2 项目中创建了一个模型类。该值仍为 NULL。 Fiddler 在 HTTP POST 请求中显示该值。【参考方案2】:我的 “REAL” 问题原来是 Transfer-Encoding: chunked 在请求标头中发送。
这是我更正的代码(dotnet core web 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 不起作用...
【讨论】:
以上是关于dotnet core webapi调用.net webapi2的主要内容,如果未能解决你的问题,请参考以下文章
dotnet core 5 Webapi 向 HTTPPOST 发送 Json 响应
将 JSON 数据发布到 Dotnet Core webapi
.NET Core 处理 WebAPI JSON 返回烦人的null为空
dotnet core webapi json-api 兼容查询字符串路由