这是我当前尝试使用REST API的方式
private HttpClient client = new HttpClient();
public HomeController(IAuthenticationClient authenticationClient)
{
client.DefaultRequestHeaders.Accept.Clear();
client.BaseAddress = new Uri("http://localhost:55260/api/Accounts/");
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
this.authenticationClient = authenticationClient;
}
public IActionResult Index()
{
var result = GetList();
return View();
}
public async Task<List<string>> GetList()
{
HttpResponseMessage response = await client.GetAsync("GetList");
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsAsync<List<string>>();
}
return new List<string>();
}
这是被调用的API:
[HttpGet]
[Route("GetList")]
[AllowAnonymous]
public ActionResult<IEnumerable<string>> GetList()
{
return new string[] { "value1", "value2" };
}
问题在于,如果我在Postman上进行测试,会得到正确的结果,分别是value1和value2,但是,当我从api客户端调用它时,却得到了这个奇怪的结果,而不是正确的结果。
我已经尝试了许多不同的指南,但是似乎都不起作用。是否有库可处理.net core 2.1的REST api?还是我最好只使用httpclient?
答案 0 :(得分:3)
如您对原始问题here的回答所述,您在调用await
方法时缺少关键字GetList
。让我们回顾一下您的代码:
public IActionResult Index()
{
var result = GetList();
return View();
}
public async Task<List<string>> GetList()
{
HttpResponseMessage response = await client.GetAsync("GetList");
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsAsync<List<string>>();
}
return new List<string>();
}
您的方法GetList
返回Task<List<string>>
。返回Task
时,您需要完成await
个任务才能访问结果。否则,您将只得到一个Task
对象。如果您查看调试窗口,则可以看到那里列出的属性与属于Task
的属性匹配。
那么,如何等待任务完成才能获得结果?使用await
关键字。
解决此问题的最佳方法是使您的Index
方法也异步
public async Task<IActionResult> Index()
{
var result = await GetList();
return View(result);
}
我们已将方法签名更改为包括async
关键字,并将结果包装在Task
中。
此处的更改意味着您现在可以await
完成由GetList
方法返回的任务,并且result
变量将保存您的List<string>
数据,然后您可以将其传递给视图。
可以在异步上找到更多内容,然后等待here