.NET Core 2.1使用REST API不会返回结果

时间:2018-10-11 05:16:42

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

这是我当前尝试使用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客户端调用它时,却得到了这个奇怪的结果,而不是正确的结果。

enter image description here

我已经尝试了许多不同的指南,但是似乎都不起作用。是否有库可处理.net core 2.1的REST api?还是我最好只使用httpclient?

1 个答案:

答案 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