Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to return a list of objects in ASP.NET Web API async controller method

How to return a list of objects in the ASP.NET Web API async controller method or wrap a list inside the Task object?

Class:

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

  public SubscriberHistory(string Date, string Message)
  {
    this.Date = Date;
    this.Message = Message;
  }
}

Controller:

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

Controller Manager:

public async List<SubscriberHistory> GetSubscriberHistory()
{
    List<SubscriberHistory> List = new List<SubscriberHistory>();
    // HttpClient get data
    return List; // ?
}
like image 362
blindpilot Avatar asked May 19 '16 11:05

blindpilot


2 Answers

Never return a Task from an action method if you are not executing anything async: it is useless and will also adds unnecessary overhead to your call.

To return a list of objects, simply declare the correct return type:

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

If you, instead, want to do it asynchronously, then you'll have to return a Task<T> and await the result:

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

And in your manager:

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;
}
like image 144
Federico Dipuma Avatar answered Sep 21 '22 05:09

Federico Dipuma


If you want to use Async Controller, you need to update your code like this:

[HttpGet("[action]/{accountNumber}")]
public async Task<IHttpActionResult> GetSubscriberHistory(string accountNumber)
{
    SubscriberManager subsManager = new SubscriberManager();
    return await subsManager.GetSubscriberHistoryByAccountNumber(accountNumber);
}

There should be async and await in your Controller function if you want to use Async controller. Thanks!

like image 22
Saadi Avatar answered Sep 23 '22 05:09

Saadi