.NET Core 2.1 HttpClient不返回期望值

时间:2018-10-11 03:13:21

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

我正在使用接口从此网址http://localhost:55260/api/Accounts/GetList调用api

这是其引用的控制器:

[HttpGet]
[Route("GetList")]
[AllowAnonymous]
public ActionResult<IEnumerable<string>> GetList()
{
    return new string[] { "value1", "value2" };
}

但是,我得到的不是返回字符串,而是:

enter image description here

这就是我声明httpclient / interface的方式:

private readonly HttpClient httpClient;
public AuthenticationClient(HttpClient httpClient)
{
    httpClient.BaseAddress = new Uri("http://localhost:55260/api/Accounts");
    httpClient.DefaultRequestHeaders.Accept.Clear();
    httpClient.DefaultRequestHeaders.Accept.Add(
        new MediaTypeWithQualityHeaderValue("application/json"));
    this.httpClient = httpClient;
}

public async Task<IEnumerable<string>> GetDataAsync()
{
    List<string> result = null;
    HttpResponseMessage response = await httpClient.GetAsync("/GetList");
    if (response.IsSuccessStatusCode)
    {
        result = await response.Content.ReadAsAsync<List<string>>();
    }
    return result;
}

我已经在Startup.cs中将其声明为services.AddHttpClient();

这就是我所谓的界面

private readonly IAuthenticationClient authenticationClient;
public HomeController(IAuthenticationClient authenticationClient)
{
    this.authenticationClient = authenticationClient;
}

public IActionResult Index()
{
    var result = authenticationClient.GetData();
    return View();
}

我错过了什么吗?或者是否有关于如何使用HttpClients的教程?另外,如何通过此发布数据?

3 个答案:

答案 0 :(得分:4)

您的接口定义了一个异步调用。换句话说,“ GetData”返回Task<string>而不是实际值。

为了获得实际值,请尝试以下操作(徒手编码,以便进行调试)

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

答案 1 :(得分:0)

我将控制器代码更改为

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

修改GetDataAsync()

HttpResponseMessage response = await httpClient.GetAsync("/api/Accounts/GetList");

答案 2 :(得分:0)

ASP.NET Core 2.1包括一项新的IHttpClientFactory服务,可以更轻松地在应用程序中配置和使用HttpClient的实例。 HttpClient已经具有委托处理程序的概念,可以将这些处理程序链接在一起以用于传出的HTTP请求。工厂:

  • 使每个命名客户端的HttpClient实例注册更多 直观。
  • 实现一个Polly处理程序,该处理程序允许将Polly策略用于 重试,CircuitBreakers等

有关更多信息,请参见Initiate HTTP Requests