【问题标题】:How to return a list of objects in ASP.NET Web API async controller method如何在 ASP.NET Web API 异步控制器方法中返回对象列表
【发布时间】:2016-09-16 06:52:50
【问题描述】:

如何在 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;
  }
}

控制器:

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

控制器管理器:

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

【问题讨论】:

    标签: c# asp.net asp.net-web-api async-await


    【解决方案1】:

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

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

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

    如果您想要异步执行此操作,则必须返回 Task&lt;T&gt; 并等待结果:

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

    在你的经理中:

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

    【讨论】:

    • 谢谢,费德里科!在我的方法中,我试图从 Web 服务中获取数据,为此我必须使用 HttpClient 类,而后者又使用异步方法
    • 我在答案中添加了异步方法。永远记住,要能够使用async/await,您的整个调用链必须变为async并返回Task/Task&lt;T&gt;
    • 太棒了!谢谢费德里科。这就是我需要的。
    【解决方案2】:

    如果你想使用异步控制器,你需要像这样更新你的代码:

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

    如果你想使用异步控制器,你的控制器函数中应该有 async 和 await。 谢谢!

    【讨论】:

      猜你喜欢
      • 2014-01-02
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 2017-12-31
      • 1970-01-01
      相关资源
      最近更新 更多