c# - 来自 API 的 ResponseStream 导致反序列化时出现空值

标签 c# asp.net-mvc rest asp.net-core asp.net-web-api

从我的 API 返回数据并在客户端 Controller 中对其进行反序列化,内容似乎为空。我已经验证 API 正在返回有效数据,并且响应中的“计数”是准确的。但是序列化时的数据好像没有初始化。

不太确定在哪里查找导致问题的原因。我最好的理论是,由于异步,数据在具体化之前就被反序列化了,但这并不能解释为什么计数是正确的(2 条记录)。

public async Task<IActionResult> Index()
{
  var httpClient = _httpClientFactory.CreateClient("APIClient");

  var request = new HttpRequestMessage(HttpMethod.Get, "/api/AppUsers");
        
  var response = await httpClient.SendAsync(request).ConfigureAwait(false);

  if (response.IsSuccessStatusCode)
  { 
    using (var responseStream = await response.Content.ReadAsStreamAsync())        
    {
      var users = await JsonSerializer.DeserializeAsync<IList<AppUser>>(responseStream);

      return View(new IndexViewModel(users));
    }
  }
  else if (response.StatusCode == System.Net.HttpStatusCode.Unauthorized ||
          response.StatusCode == System.Net.HttpStatusCode.Forbidden) 
  {
    return RedirectToAction("AccessDenied", "Authorization");
  }
  throw new Exception("Problem accessing the API");
  
}

调用的API方法

[HttpGet]
public IActionResult GetAppUsers()
{
  var users = _appUserService.ListAppUsers();
  return Ok(users);
}

enter image description here

直接调用API方法显示按预期返回2行 enter image description here

经过一些调试,我注意到从 API 返回的 json 结构的属性名称首字母为小写,但 AppUser 类的首字母大写。不确定为什么会发生这种情况,但这就是反序列化失败的原因。

最佳答案

尝试反序列化为 List 而不是 IList:

var users = await JsonSerializer.DeserializeAsync<List<AppUser>>(responseStream);

我认为您应该删除ConfigureAwait(false),以便可以保留在相同的同步上下文中。

有关更多信息,请查看此链接:https://devblogs.microsoft.com/dotnet/configureawait-faq/

关于c# - 来自 API 的 ResponseStream 导致反序列化时出现空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72177232/

相关文章:

c# - 检测何时设置了 Application.Current.RootVisual (Silverlight)

c# - MVC 5 在键入时显示错误消息输入字段

c# - 使用 RSS SyndicatedFeed api 渲染 pubDate

javascript - 在 JavaScript 中使用 GET 调用 RESTful Web 服务

c# - 如何跟踪文本文件中的字数

c# - 在 C# .NET 中清理 ODBC DSN

c# - MVC 6的MemoryCache应该在 Controller 级别使用还是在服务级别使用?

python - 将一个休息资源路由为第二个休息资源的子资源

java - Jersey HTTP 响应 200 OK 但返回内容错误(用户名/密码不正确)

c# - MSDTC 第一次交易失败