澄清IAsyncEnumerable如何与ASP.NET Web API一起使用


9

在ASP.NET Web API项目中浏览IAsyncEnumerable时遇到了一个有趣的行为。考虑以下代码示例:

    // Code Sample 1
    [HttpGet]
    public async IAsyncEnumerable<int> GetAsync()
    {
        for (int i = 0; i < 10; i++)
        {
            await Task.Delay(1000);
            yield return i;
        }
    }


    // Code Sample 2
    [HttpGet]
    public async IAsyncEnumerable<string> GetAsync()
    {
        for (int i = 0; i < 10; i++)
        {
            await Task.Delay(1000);
            yield return i.ToString();
        }
    }

示例1(int数组){}作为JSON结果返回。

样本2返回预期结果["0","1","2","3","4","5","6","7","8","9"]。但是,等待10秒后立即返回整个JSON数组。当数据从IAsyncEnumerable接口获得预期的可用性时,是否应该将其返回?还是应该使用此Web API的任何特定方式?


4
当数据从IAsyncEnumerable接口获得预期的可用性时,是否应该将其返回?...而且确实...但是对于json序列化程序
Selvin

1
和样本1 ....似乎是非引用类型的错误(如果更改IAsyncEnumerable<int>IAsyncEnumerable<object>-应该可以工作,但是会涉及拳击)
Selvin

@Selvin,请您详细说明一下?还是指向代码示例?我尝试使用C#客户端使用此API,结果是一样的,必须等待10秒钟...
Ravi M Patel

必须等待10秒钟,这很麻烦...序列化在服务器端,并且不是异步的...详细说明什么?
Selvin

1
该错误在这里 ... 显然这就是原因
Selvin

Answers:


3

网络API调用不会每秒返回部分json。是json序列化程序,必须等待10x1秒(或调用json序列化程序的代码,这是ASP .NET的一部分)。一旦框架代码和序列化程序获得了所有数据,它将被序列化(作为一个响应)提供给客户端。

ASP.NET Core Web API中的Controller操作返回类型中,我们可以阅读:

在ASP.NET Core 3.0和更高版本中,从操作返回IAsyncEnumerable:

  • 不再导致同步迭代。
  • 变得与返回IEnumerable一样有效。

ASP.NET Core 3.0和更高版本在将以下操作的结果提供给序列化程序之前会对其进行缓冲:

public IEnumerable<Product> GetOnSaleProducts() =>
  _context.Products.Where(p => p.IsOnSale);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.