如何确保 webapi 控制器从异步方法获取完整数据?

How can I make sure that a webapi controller is getting the full data from an async method?

我有一个 webapi 服务,这个服务的控制器正在调用一个远程 webapi 来获取数据。

我有一个示例控制器,它具有以下测试方法:

    [HttpGet("activity")]
    public ActionResult<BoredAPIDM> GetActivity()
    {
        Processor pr = new Processor();
        object data = pr.GetActivity();
        Debug.WriteLine(data); // Breakpoint
        return Ok();
    }

并且处理器 class 具有以下方法:

    public async Task GetRemoteActivity()
    {
        string baseURL = $"https://www.boredapi.com/api/activity";

        using (var client = new HttpClient())
        {

            client.BaseAddress = new Uri(baseURL);
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            HttpResponseMessage response = await client.GetAsync("activity");

            if (response.IsSuccessStatusCode)
            {
                string result = response.Content.ReadAsStringAsync().Result;
                DataTable dt = JsonConvert.DeserializeObject<DataTable>(result);
            }
            else
            {
                Debug.WriteLine($"Error calling the API from {baseURL}");
            }
        }
    }

因此,我期待的是 GetRemoteActivity() 方法中的数据内容,但它没有进入 GetActivity() 方法中,并且调试行上的断点显示:

Id = 117, Status = WaitingForActivation, Method = "{null}", Result = "{Not yet computed}"

我觉得我漏掉了整整一点;这是什么?

这里遗漏了很多,所以我会尽力为您分解:

  • object data = pr.GetActivity(); 这应该调用 GetRemoteActivity 吗?
var data = await pr.GetRemoteActivity(); // prefix the current method with async
  • public async Task GetRemoteActivity() 不 return 一个 DataTable.
public async Task<DataTable> GetRemoteActivity()
  • using (var client = new HttpClient()) 应该是一个单例,从不更新每个方法调用。

  • DataTable dt = JsonConvert.DeserializeObject<DataTable>(result); 您确定这会正确绑定到 JSON 吗?我非常怀疑,但检查 API 响应。这可能需要一个单独的 DTO 来匹配响应。

  • 调试器returns Status = WaitingForActivation因为你需要await调用。 Awaitable 调用延迟加载并且在您执行适当的 await 之前不执行。