PostAsJsonAsync没有按预期方式运行

时间:2018-11-08 00:34:01

标签: c# asp.net asp.net-web-api2 dotnet-httpclient

我正在尝试使用PostAsJsonAsync调用API,但无法正常工作。

回购:

  1. 创建一个ASP.NET WebAPi项目(.NET Framework 4.7.2)
  2. Post中的ValuesController方法替换为

    // POST api/values
    public async Task<IHttpActionResult> Post(string[] array)
    {
        var suffix = array == null ? "is null" : $"has {array.Length} elements";
        var message = $"`array` {suffix}";
        return Ok(message);
    }
    
  3. 创建一个控制台应用程序以访问该API。

    static async Task Main(string[] args)
    {
        const string url = "http://localhost:6757/api/values";
        var value = new List<string> { "a", "b" };
        var client = new HttpClient();
    
        var response = await client.PostAsJsonAsync(url, value);
        var message = await response.Content.ReadAsStringAsync();
        Console.WriteLine(message);
    
        // Do what I think PostAsJsonAsync is essentially doing
        var json = JsonConvert.SerializeObject(value);
        var content = new StringContent(json, Encoding.UTF8, "application/json");
        response = await client.PostAsync(url, content);
        message = await response.Content.ReadAsStringAsync();
        Console.WriteLine(message);
    }
    
  4. 先运行WebApi,再运行控制台应用程序

预期输出:

  

array有2个元素”

     

array有2个元素”

实际输出:

  

array为空”

     

array有2个元素”

因此,我更改了Post方法以根据请求比较内容字符串。

public async Task<IHttpActionResult> Post()
{
    var value = await Request.Content.ReadAsStringAsync();
    return Ok();
}

他们都将value设置为["a","b"]

那么PostAsJsonAsync为什么不能像我认为的那样工作?

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,基本上,PostAsJsonAsync()正在将List<string>序列化为"a,b"

我建议使用与示例相同的代码:

var json = JsonConvert.SerializeObject(value);
var content = new StringContent(json, Encoding.UTF8, "application/json");
response = await client.PostAsync(url, content);

证明有效。