我可以(或应该)在Web API控制器中使用IAsyncEnumerable<;T&>;而不是Task<;ActionResult<;IEnumerable<;T>;>;>; [英] Can (or should) I use IAsyncEnumerable<T> instead of Task<ActionResult<IEnumerable<T>>> in a Web API Controller
本文介绍了我可以(或应该)在Web API控制器中使用IAsyncEnumerable<;T&>;而不是Task<;ActionResult<;IEnumerable<;T>;>;>;的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我当前有一个Web API,
- 使用存储库中的
FromSqlRaw(...).ToListAsync()
提取一行数据 - 通过控制器将此数据作为
Ok(data.ToArray())
作为Task<ActionResult<IEnumerable<MyClass>>>
返回。
现在我想知道是否应该或可以使用IAsyncEnumerable作为返回类型。我们的想法是在存储库和控制器中使用它。但是,在这个(现已老化)thread中,它声明不应该使用它。这里建议的解决方案类似于:
FromSqlRaw(...).AsNoTracking().AsAsyncEnumerable()
对于控制器,我希望将响应用ActionResult
包装起来,以显式设置返回代码。但是,that当前似乎不起作用。
我应该仅将解决方案应用于存储库并在控制器中以列表形式使用结果,还是仅保持其原样?
推荐答案
IAsyncEnumerable
为您提供了一个pull-based asynchronous取数界面。换言之,此API表示一个迭代器,在该迭代器中异步获取下一项。
这意味着您将分几轮接收数据,并且每轮都以异步方式接收。
在
IAsyncEnumerable
之前,您可以使用IEnumerable<Task<T>>
,它表示一组返回类型为T
的异步操作。,而
Task<IEnumerable<T>>
表示返回类型为IEnumerable<T>
的单个异步操作。
让我们将这些知识应用于WebAPI:
- 从HTTP消费者的角度看,
Task<ActionResult<T>>
和ActionResult<T>
没有区别。这是从用户角度看的实现详细信息。 - WebAPI控制器的操作实现请求-响应模型。这意味着在消费者端发送单个请求并接收单个响应。
- 如果使用者再次调用同一操作,则将实例化一个新控制器,并将处理该请求。
这意味着如果API作为操作结果类型公开,则API的使用者无法利用IAsyncEnumerable
。
这篇关于我可以(或应该)在Web API控制器中使用IAsyncEnumerable<;T&>;而不是Task<;ActionResult<;IEnumerable<;T>;>;>;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文