为什么我的HttpClient调用没有返回预期的Json?

时间:2017-10-28 18:21:13

标签: c# json asp.net-core json.net

我有客户服务。在该服务中,我有以下方法:

public async Task<IEnumerable<Client>> ReadAsync()
{
    using (var conn = new SqlConnection(_connString)) 
    using (var cmdRead = new SqlCommand("SELECT * FROM Client", conn))
    {
        conn.Open();
        var ret = new List<Client>();

        var reader = await cmdRead.ExecuteReaderAsync();
        while (reader.Read())
        {
            var client = BuildFromDataReader(reader);
            ret.Add(client);
        }

        return ret;
    }
}

此方法由Web API控制器操作调用,如下所示:

[HttpGet]
public async Task<IEnumerable<Client>> Get()
{
    // API side.
    IEnumerable<Client> clients = await _clients.ReadAsync();
    return clients;
}

我希望内容协商的默认值为JSON,因此希望此操作返回JSON编码的Client列表。

我所有尝试使用Web API的客户端看起来更像是这样:

public async Task<IEnumerable<Client>> ReadAsync()
{
    var json = await Client.GetStringAsync("api/Clients/Get");
    var clients = JsonConvert.DeserializeObject<IEnumerable<Client>>(json);
    return clients;
}

在断点检查时,json的值为"value"(包含引号)。我试过了什么?上面的代码。我期望通过Web API操作返回的json在哪里?

PS:我正在忙于ASP.NET核心项目,因此我们也在使用NewtonSoft JSON。

2 个答案:

答案 0 :(得分:1)

我认为下来的选票是由于你在没有核实事实的情况下表达了一个假设。

一个简单的三步谷歌搜索引导https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/content-negotiation,详细说明了webapi用于内容协商的标准。

正如你可以从中看到的那样,你的假设是不正确的 - 假设总是没有假设吗?

只有在请求声明它接受的内容时才会返回Json。因此,您需要在请求上设置接受标头以接受Json。引用文章:

GET http://localhost.:21069/api/products/1 HTTP/1.1 Host: localhost.:21069 Accept: application/json, text/javascript, */*; q=0.01

答案 1 :(得分:0)

这似乎是一个非常不可能的失败点,但我在研究HttpClient和这个问题时遇到了很多次。

看起来BaseAddress字符串属性必须以尾随“/”结尾。我不知道我是否无意中改变了别的东西,但是一旦我添加了这个尾随斜线,我就重新开始了。例如。端口号后的斜杠:

private static readonly HttpClient Client = new HttpClient {BaseAddress = new Uri("http://localhost:63675/") };