6

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; // ?
}

2 Answers 2

7

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;
}
Sign up to request clarification or add additional context in comments.

3 Comments

Thanks, Federico! Inside of my method I'm trying to get data from a web service and to do that I have to use the HttpClient class, which in turn uses asynchronous methods
I added the asynchronous approach inside the answer. Always remember that to be able to use async/await your entire call chain must become async and return a Task/Task<T>.
Great! Thank you Federico. That's what i need.
1

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!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.