【问题标题】:.NET Core 2.1 Consuming REST API doesn't return results [duplicate].NET Core 2.1 使用 REST API 不返回结果 [重复]
【发布时间】:2019-03-16 02:25:01
【问题描述】:

这就是我目前尝试使用 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?

【问题讨论】:

  • 如果它是从邮递员那里工作的,请点击保存按钮附近的代码链接从邮递员那里获取代码

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


【解决方案1】:

正如您对原始问题here 的回答中所述,您在调用GetList 方法时缺少关键字await。让我们检查一下您的代码:

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&lt;List&lt;string&gt;&gt;。当您返回Task 时,您需要先完成任务await,然后才能访问结果。否则你只会得到一个Task 对象。如果您查看调试窗口,您会看到那里列出的属性与属于Task 的属性相匹配。

那么,您如何等待任务完成才能获得结果?使用 await 关键字。 解决此问题的最佳方法是使您的 Index 方法也异步

public async Task<IActionResult> Index()
{
    var result = await GetList();
    return View(result);
}

我们已更改方法签名以包含 async 关键字,并将结果包装在 Task 中。 此处的更改意味着您现在可以通过await 完成由GetList 方法返回的任务,并且result 变量将保存您的List&lt;string&gt; 数据,然后您可以将其传递给视图。

更多内容请参见 async 和 await here

【讨论】:

    猜你喜欢
    • 2022-06-22
    • 2017-12-22
    • 2015-01-26
    • 2016-10-10
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多