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 兼容查询字符串路由

AngularJS 2调用.net core WebAPI的几个坑

.Net Core - 无法连接 WCF 服务(在 Mac 上)