如何确保 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 之前不执行。
我有一个 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 之前不执行。