dotnet核心webapi调用.net webapi2

时间:2018-10-05 20:17:23

标签: .net-core asp.net-web-api2 asp.net-core-2.0 dotnet-httpclient asp.net-web-api-routing

我正在从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) 
    {

    }

2 个答案:

答案 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无法正常工作...