【问题标题】:Why is my HttpClient call not returning expected Json? [closed]为什么我的 HttpClient 调用没有返回预期的 Json? [关闭]
【发布时间】:2018-04-10 02:51:33
【问题描述】:

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

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 Core 项目,所以我们也在使用 NewtonSoft JSON。

【问题讨论】:

  • 等一下,我正在看。快速提问。是 web service web api 2 还是 asp.net core?
  • Client.GetStringAsync 方法里面有什么?您说Client 是您的业务对象,代表您的业务客户,而不是通信客户,对吧?
  • @ProfK 如果您提供minimal reproducible example,问题是可以挽救的。现在有太多的问题需要问来澄清问题。 Brian 问了一个关于GetStringAsync 的好问题。这是一个失败点。我认为它来自 HttpClient。还有web api的设计方式。
  • 您是否尝试过使用 Postman 或 curl 之类的工具来访问 api/Clients/Get 端点?
  • @Nkosi 我确实在问题的底部声明它是核心。

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


【解决方案1】:

我认为否决票是由于您在未验证您的事实的情况下表达了假设。

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

正如您所看到的,您的假设不正确 - 假设不总是不正确的吗?

只有当请求声明它会接受时才会返回 Json。所以需要在请求上设置accept header来接受Json。引用文章:

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

【讨论】:

  • 你对我的假设是正确的,我向那些假设使问题难以理解的成员道歉。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 2023-04-06
    • 2020-06-30
    相关资源
    最近更新 更多