如何在 ASP.NET Web API 异步控制器方法中返回对象列表

bli*_*lot 5 c# asp.net async-await asp.net-web-api

如何在 ASP.NET Web API 异步控制器方法中返回对象列表或在 Task 对象中包装一个列表?

班级:

public class SubscriberHistory
{
  public string Date;
  public string Message;

  public SubscriberHistory(string Date, string Message)
  {
    this.Date = Date;
    this.Message = Message;
  }
}
Run Code Online (Sandbox Code Playgroud)

控制器:

[HttpGet("[action]/{accountNumber}")]
public Task<SubscriberHistory> GetSubscriberHistory(string accountNumber)
{
    SubscriberManager subsManager = new SubscriberManager();
    return subsManager.GetSubscriberHistoryByAccountNumber(accountNumber);
}
Run Code Online (Sandbox Code Playgroud)

控制器经理:

public async List<SubscriberHistory> GetSubscriberHistory()
{
    List<SubscriberHistory> List = new List<SubscriberHistory>();
    // HttpClient get data
    return List; // ?
}
Run Code Online (Sandbox Code Playgroud)

Fed*_*uma 5

Task如果您没有执行任何操作,则永远不要从操作方法中返回 a async:它是无用的,并且还会为您的调用增加不必要的开销。

要返回对象列表,只需声明正确的返回类型:

[HttpGet("[action]/{accountNumber}")]
public List<SubscriberHistory> GetSubscriberHistory(string accountNumber)
{
    SubscriberManager subsManager = new SubscriberManager();
    return subsManager.GetSubscriberHistoryByAccountNumber(accountNumber);
}
Run Code Online (Sandbox Code Playgroud)

相反,如果您想异步执行此操作,则必须返回 aTask<T>并等待结果:

[HttpGet("[action]/{accountNumber}")]
public async Task<List<SubscriberHistory>> GetSubscriberHistory(string accountNumber)
{
    SubscriberManager subsManager = new SubscriberManager();
    return await subsManager.GetSubscriberHistoryByAccountNumber(accountNumber);
}
Run Code Online (Sandbox Code Playgroud)

在您的经理中:

public async Task<List<SubscriberHistory>> GetSubscriberHistory()
{
    List<SubscriberHistory> list = new List<SubscriberHistory>();
    var result = await client.GetAsync("http://myhost/mypath");
    //Your code here
    return list;
}
Run Code Online (Sandbox Code Playgroud)