无法将字符串列表传递到 Web API 端点。为什么?

Can not pass a list of strings to a Web API endpoint. Why?

无法将字符串列表传递到 Web API 端点。为什么?

这是我的控制器:

[Route("[controller]")]
[ApiController]
public class MyController
{
    [HttpPost("foo")]
    public string MyMethod(List<string> strs)
    {
        return "foo";
    }
}

我是这样称呼它的:

var strs = new List<string> { "bar" };
var json = JsonConvert.SerializeObject(strs);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await httpCliet.PostAsync("/My/foo", content);

在调用端点之前,我在 return "foo"; 行上放置了一个断点。一旦遇到断点,MyController.MyMethod 中的 strs 列表为空。 strs 不为空,但不包含任何元素。虽然我的意图和期望是看到 strs 包含一个元素,即字符串 "bar".

我在创建和使用 HttpClient 的项目中使用 ASP.NET Core 2.2。我在拥有端点的项目中使用相同的 ASP.NET Core 2.2。

我不确定这里有什么问题。我检查了一些来源。例如。以下:

https://carldesouza.com/httpclient-getasync-postasync-sendasync-c/

https://blog.jayway.com/2012/03/13/httpclient-makes-get-and-post-very-simple/

根据那些资源我找不到我缺少的东西。

更新

下面的调用符合我的预期:

var json = JsonConvert.SerializeObject(string.Empty);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await server.CreateClient().PostAsync("/My/foo?strs=bar", content);

也许有人知道为什么我的例子中的参数只从查询字符串中读取,而不是从正文中读取?

您可以在 client.PostAsync 中将 url 更改为完整的 url。这是一个演示:

Api(localhost:44379):

天气预报控制器:

[HttpPost("foo")]
        public string MyMethod(List<string> strs)
        {
            return "foo";
        }

呼叫(本地主机:44326):

public async Task<IActionResult> CheckAsync() {
            HttpClient client = new HttpClient();
            var strs = new List<string> { "bar","bar1","bar2" };
            var json = JsonConvert.SerializeObject(strs);
            var content = new StringContent(json, Encoding.UTF8, "application/json");
            var response = await client.PostAsync("https://localhost:44379/WeatherForecast/foo", content);
            return Ok(response);
        }

结果: