ASP.NET 核心 2.x - HttpClient api returns 错误 'Object reference not set to an instance of an object'

ASP.NET Core 2.x - HttpClient api returns error 'Object reference not set to an instance of an object'

我通过发送httpClient消息请求查询了一个publicAPI(https://api.bitfinex.com/v1/pubticker/ethusd),但我不知道为什么结果returns为空对象错误,即使 REST API 本身工作正常。我哪里错了?

private readonly HttpClient _httpClient;
private const string apiUri = "https://api.bitfinex.com/v1/pubticker/ethusd";

public DataController(
  HttpClient httpClient
)
{
  httpClient = _httpClient;
}

[HttpGet("ticker")]
[ProducesResponseType(typeof(Ticker), 200)]
public async Task<IActionResult> GetTicker()
{
  HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, apiUri);
  requestMessage.Headers.Accept.Add(
    new MediaTypeWithQualityHeaderValue("application/json")
  );

  var response = await _httpClient.SendAsync(requestMessage);
  
  return Ok(response);
}

问题是试图序列化来自 HttpClient 的响应。这是不正确的,并且会导致各种问题,因为你有流等涉及。您应该做的是将内容读入一个对象,然后 return 那:

using (var response = await _httpClient.SendAsync(requestMessage))
{
    var content = await response.Content.ReadAsAsync<SomeClass>();
    return Ok(content);
}

或者,如果您没有使用可以映射到的 class,并且不想创建一个,您可以直接使用 JSON.NET 手动反序列化响应内容:

using (var response = await _httpClient.SendAsync(requestMessage))
{
    var content = await response.Content.ReadAsStringAsync();
    var model = JsonConvert.DeserializeObject(content);
    return Ok(model);
}

在您的代码更改中,

public DataController(
  HttpClient httpClient
)
{
  httpClient = _httpClient;
}

public DataController(
  HttpClient httpClient
)
{
  _httpClient = httpClient;
}