Encontré un comportamiento interesante al explorar IAsyncEnumerable en un proyecto de API web ASP.NET. Considere los siguientes ejemplos 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();
}
}
La muestra 1 (int array) vuelve {}
como resultado JSON.
La muestra 2 devuelve el resultado esperado ["0","1","2","3","4","5","6","7","8","9"]
. Sin embargo, toda la matriz JSON se devuelve a la vez después de 10 segundos de espera. ¿No debería devolverse a medida que los datos estén disponibles como se esperaba de la interfaz IAsyncEnumerable? ¿O hay alguna forma específica de consumir esta API web?
c#
asp.net-core
asp.net-core-webapi
iasyncenumerable
Ravi M Patel
fuente
fuente
IAsyncEnumerable<int>
aIAsyncEnumerable<object>
- debería funcionar pero hay un recuadro involucrado)Respuestas:
Una llamada de API web no devolverá json parcial cada segundo. Es el serializador json el que tiene que esperar 10x1 segundos (o el código que llama al serializador json, que es parte de ASP .NET). Una vez que el código marco y el serializador obtengan todos los datos, se servirán en serie, como respuesta única, al cliente.
En los tipos de retorno de acción del Controlador en la API web ASP.NET Core podemos leer:
fuente