Encontrei um comportamento interessante ao explorar IAsyncEnumerable em um projeto de API da Web do ASP.NET. Considere os seguintes exemplos de código:
// 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();
}
}
A amostra 1 (matriz int) retorna {}
como resultado JSON.
A amostra 2 retorna o resultado esperado ["0","1","2","3","4","5","6","7","8","9"]
. No entanto, toda a matriz JSON é retornada ao mesmo tempo após 10 segundos de espera. Ele não deve ser retornado quando os dados estiverem disponíveis conforme o esperado da interface IAsyncEnumerable? Ou existe alguma maneira específica de que essa API da Web deva ser consumida?
c#
asp.net-core
asp.net-core-webapi
iasyncenumerable
Ravi M Patel
fonte
fonte
IAsyncEnumerable<int>
paraIAsyncEnumerable<object>
- ele deve funcionar, mas depois há um boxe envolvidos)Respostas:
Uma chamada de API da Web não retornará json parcial a cada segundo. É o serializador json que precisa esperar 10 x 1 segundo (ou o código que chama o serializador json, que faz parte do ASP .NET). Depois que o código da estrutura e o serializador obtiverem todos os dados, eles serão serializados servidos - como uma única resposta - ao cliente.
Nos tipos de retorno de ação do Controller na API da web do ASP.NET Core , podemos ler:
fonte