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



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

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。

我认为反对票是由于您在没有验证您的事实的情况下表达了假设。

一个简单的三步谷歌搜索导致 https://learn.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

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

看起来 BaseAddress 字符串属性必须以尾随的"/"结尾。我不知道我是否无意中改变了其他内容,但是一旦我添加了尾部斜杠,我就重新开始营业了。例如,端口号后面的斜杠:

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

相关内容

  • 没有找到相关文章

最新更新